objective-c - iOS NSString stringWithUTF8String/NSString initWithCString 错误utf8解码

标签 objective-c c string utf-8 character-encoding

我正在读取一个二进制文件,里面有一些文本字段。

原字段值为"asdf è"(无法更改二进制文件编码)

UTF-8 编码为 "asdf\xc3\xa8"

我读的是 "asdf\xc3\x83\xc2\xa8" 所以 NSString stringWithUTF8String:initWithCString 方法给我 "asdf ¨"

如何取回正确的"asdfè"值?

谢谢

最佳答案

你从二进制文件中读取的确实是一种奇怪的“编码”。

  • C3 A8U+00C3 ("Ã") 的 UTF-8 序列
  • C2 A8 它是 U+00A8 ("¨") 的 UTF-8 序列
  • 这些Unicodes 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);   // è

关于objective-c - iOS NSString stringWithUTF8String/NSString initWithCString 错误utf8解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24554795/

相关文章:

c - 查找长度超过 5 的行数

c - C 中优先级 and++ 和 * 一元运算符的问题

c# - 如何用空格字符替换无数字字符?

java - 如何将字符串转换为图像(Java)

objective-c - 从一位整数生成两位数的字符串

ios - UIWebview 显示之前加载的内容

c++ - 将整数序列写入全局内存的快速(est)方法?

iOS-WatchKit 文件传输工作不可靠

objective-c - 如何在Cocoa中关闭蓝牙设备和声音设备?

c# - 如何处理 C# 中引号内的引号?