用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。