我是 Objective-C 新手,尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html.
NSString *theString = @"Lügen"; //should be "ü"
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];
NSLog(@"Original: %@ (length %d)", theString, [theString length]);
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]);
Result:
Original: Lügen (length 6)
Converted: LA1/4gen (length 8)
这里什么也没做:
NSString* str = [NSString stringWithUTF8String:
[theString cStringUsingEncoding:NSASCIIStringEncoding]];
这使我的应用程序崩溃
NSString* str = [NSString stringWithUTF8String:
[theString cStringUsingEncoding:NSUTF8StringEncoding]];
有人知道我做错了什么吗?
NSString *string = @"ü";
const char *c = [string cStringUsingEncoding:NSISOLatin1StringEncoding];
NSString *newString = [[NSString alloc]initWithCString:c encoding:NSUTF8StringEncoding];
NSLog(@"%@",newString); // ü
“格式错误的 UTF-8 序列”是指在 UTF-8 中无效的字节序列。您的问题是使用与字符串原始作者使用的编码不同的编码解析字符串后出现意外结果。
十六进制数据C3 BC
parsedUTF-8编码是字符ü
。相反,您使用了 Latin-1 编码,这会导致ü
。然后你从Latin-1解析的字符串创建了一个NSString,这意味着你转换的Latin-1 字符串转换为 UTF-16 字符串(这是 NSString 的本机格式)。
以不同的编码表示给定的数据会显示为不同的字符,但不会更改数据。转换为不同的编码确实会更改数据以尝试重现相同的字符。示例:角色ü
is C3 83 C2 BC
在 UTF-8 中,但是C3 BC
拉丁语-1。所以我转换为Latin-1中的相同字符来获取原始数据,然后我解析为UTF-8。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)