【问题标题】:iOS NSString stringWithUTF8String / NSString initWithCString wrong utf8 decodingiOS NSString stringWithUTF8String / NSString initWithCString utf8 解码错误
【发布时间】:2014-07-03 13:19:10
【问题描述】:
我正在读取一个二进制文件,其中包含一些文本字段。
原始字段值为"asdf è"(我无法更改二进制文件编码)
UTF-8 编码为"asdf \xc3\xa8"
我正在阅读的是"asdf \xc3\x83\xc2\xa8",所以NSString stringWithUTF8String: 或initWithCString 方法给了我"asdf è"
如何取回正确的"asdf è"值?
谢谢
【问题讨论】:
标签:
objective-c
c
string
utf-8
character-encoding
【解决方案1】:
这确实是您从二进制文件中读取的一种奇怪的“编码”。
-
C3 A8 是 U+00C3 ("Ã") 的 UTF-8 序列
-
C2 A8 它是 U+00A8 ("¨") 的 UTF-8 序列
- 这些 Unicode
C3 A8 的低字节是 U+00E8(“è”)的 UTF-8 序列
以下“技巧”使用 ISO Latin 1 编码来转换字符
U+00C3 U+00A8 到字节 C3 A8:
char *s = "\xc3\x83\xc2\xa8";
NSString *s1 = [[NSString alloc] initWithBytes:s length:strlen(s) encoding:NSUTF8StringEncoding];
NSLog(@"%@", s1); // è
NSData *d = [s1 dataUsingEncoding:NSISOLatin1StringEncoding];
NSLog(@"%@", d); // <c3a8>
NSString *s2 = [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding];
NSLog(@"%@", s2); // è