【问题标题】:Objective-C differences in UTF-8 & UTF-16 strings as bytesUTF-8 和 UTF-16 字符串作为字节的 Objective-C 差异
【发布时间】:2011-11-06 14:04:01
【问题描述】:

我正在尝试将 NSStrings 转换为字节数组,然后再转换回 NSStrings。我尝试过使用 NSUnicodeEncoding 和 NSUTF8StringEncoding。我的问题是,当我遍历字节数组时,我看到了不同的数据

此代码中唯一的变化是我将 NSUTF8StringEncoding 更改为 NSUnicodeEncoding 并添加 dataLength += 2 以便它考虑 BOM。

NSString *message = @"testing";
NSUInteger dataLength = [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
void *byteData = malloc( dataLength );
NSRange range = NSMakeRange(0, [message length]);
BOOL result =   [message getBytes:byteData maxLength:dataLength usedLength:&actualLength encoding:NSUTF8StringEncoding options:0  range:range remainingRange:&remain];
for( NSUInteger x = 0; x < dataLength; x++ )
{
    NSLog( @"byte data: %s", (char *)byteData);
    int t = (int)*(char *)byteData;
    byteData++;
}

区别在于 NSLog : 正如我看到的 NSUTF8StringEncoding

  • 测试`
  • 测试`
  • 刺痛`
  • 婷`
  • ...

正如我所看到的 NSUnicodeEncoding

  • t
  • e
  • ...

int t 值对于给定字符是正确的,但我不明白为什么 byteData 如此不同。我希望它们都像 NSUnicodeEncoding 一样。

【问题讨论】:

  • 你理解 UTF-8 和 UTF-16 作为表示的区别吗?我不知道为什么你会期望它们相似......
  • 我只是在学习,但我确实了解其中的一些差异。我的问题与为什么记录的数据如此不同有关。我以为我一次记录一个字节,但不明白多个字符怎么可能是一个字节。
  • 正好相反 - 你正在一次记录一个字节,但每个 UTF-16 代码单元是 2 个字节。
  • 我不确定我是否清楚我的意思 - 我不明白如何调用 Log(@"byte data: %s", (char *)byteData);我认为一次记录一个字节的记录是一次调用的记录测试。但从阅读大卫的答案 - 似乎我使用的格式说明符不正确。

标签: c cocoa encoding nsstring


【解决方案1】:

在 UTF8 中,字母 F 由单个 F 字节表示。字符串“FU”由一个 ASCII F 字节后跟一个 ASCII U 字节表示。在 Unicode 中(如此处使用的),每个字符占用两个字节。标准 ASCII 字符前面有一个零字节。

目前尚不清楚为什么您看到的行为与您的预期不符。在 UTF-8 中,标准 ASCII 字符占用一个字节。在你的 Unicode 编码中,占据了两个。所以肯定不会完全一样。

【讨论】:

  • 我期待当我在字节数组中记录当前字节时,它是一个字节。记录的数据( testing', esting', ... )似乎在每个日志语句中都写入了一个以上的字节。有错吗?
  • 谢谢,似乎已经做到了。我了解指针的基本概念,但我仍然迷失在一些符号和用法中。有趣的是,我在转换为 int 时使用了正确的符号,但在记录时使用了错误的符号。我认为这是因为 UTF-16 数据的日志记录工作正常——正如你所说,每隔一个位置就有 nul 字节。再次感谢。
【解决方案2】:

根据this answerNSUnicodeStringEncoding“是little-endian UTF-16前面有一个字节顺序标记”,所以应该预料到结果与UTF-8完全不同。

【讨论】:

    猜你喜欢
    • 2016-05-31
    • 2014-12-02
    • 2011-09-06
    • 2014-02-05
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2010-09-21
    • 2010-10-16
    相关资源
    最近更新 更多