使用NSString进行UTF8解码

7
我是Objective-C的新手,尝试使用苹果文档中的示例将格式不正确的UTF8编码NSString转换为格式正确的字符串。
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]);

结果:

Original: Lügen (length 6)
Converted: LA1/4gen (length 8)

这里什么也没做:

NSString* str = [NSString stringWithUTF8String:
                 [theString cStringUsingEncoding:NSASCIIStringEncoding]];

这里会导致我的应用崩溃

NSString* str = [NSString stringWithUTF8String:
                 [theString cStringUsingEncoding:NSUTF8StringEncoding]];

有人知道我做错了什么吗?


你能将字符串转储为十六进制吗?我不太擅长阅读格式错误的UTF8 :) - Joachim Isaksson
这是一个“ü”,不知道如何获取其十六进制值 ;) - Wolfgang Müller
请在任何涉及崩溃的问题中发布崩溃详细信息。 - jrturton
@Jano:你应该把那个作为答案添加进去。 - DarkDust
1个回答

16
NSString *string = @"ü";
const char *c = [string cStringUsingEncoding:NSISOLatin1StringEncoding];
NSString *newString = [[NSString alloc]initWithCString:c encoding:NSUTF8StringEncoding];
NSLog(@"%@",newString); // ü
"Malformed UTF-8 sequence" 意味着一系列在UTF-8中无效的字节序列。你的问题是使用与原始字符串作者不同的编码解析字符串后出现意外结果。 以UTF-8编码解析十六进制数据C3 BC得到字符ü,而你使用了Latin-1编码,导致结果为ü。然后你从Latin-1解析的字符串创建了一个NSString,这意味着你将Latin-1字符串转换为UTF-16字符串(这是NSString的本地格式)。
用不同的编码表示给定的数据会显示出不同的字符,但并不会改变数据。将其转换为不同的编码会尝试更改数据以重现相同的字符。例如:字符ü在UTF-8中为C3 83 C2 BC,但在Latin-1中为C3 BC。因此,我将其转换为Latin-1中的相同字符以获取原始数据,然后以UTF-8解析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接