【发布时间】: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);我认为一次记录一个字节的记录是一次调用的记录测试。但从阅读大卫的答案 - 似乎我使用的格式说明符不正确。