【问题标题】: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 A8U+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);   // è
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多