用NSString解码UTF8

我是Objective-C的新手,并尝试使用苹果文档上的示例将畸形的UTF8编码的NSString转换为格式正确的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]]; 

任何人有任何想法我做错了什么?

 NSString *string = @"ü"; const char *c = [string cStringUsingEncoding:NSISOLatin1StringEncoding]; NSString *newString = [[NSString alloc]initWithCString:c encoding:NSUTF8StringEncoding]; NSLog(@"%@",newString); // ü 

“格式错误的UTF-8序列”是指在UTF-8中无效的字节序列。 parsingstring的原始作者使用的不同编码后,您的问题是意外的结果。

用UTF-8编码parsing的hex数据C3 BC是字符ü 。 相反,你使用拉丁-1编码,这导致了ü 。 然后,您从Latin-1parsing的string创build了一个NSString,这意味着您将Latin-1string转换为一个UTF-16string(这是NSString的本机格式)。

以不同的编码表示给定的数据显示为不同的字符,但不会改变数据。 转换为不同的编码会改变数据以尝试重现相同的字符。 例如:UTF-8中的字符是C3 83 C2 BC ,而拉丁文-1是C3 BC 。 所以我转换为Latin-1中的相同字符以获取原始数据,然后我parsing为UTF-8。