C UTF-8和;UTF-16字符串作为字节

C UTF-8和;UTF-16字符串作为字节,c,cocoa,encoding,nsstring,C,Cocoa,Encoding,Nsstring,我正在尝试将NSStrings转换为字节数组,然后再转换回NSStrings。我尝试过NSUTF8StringEncoding和NSUTF8StringEncoding。我的问题是,当我迭代字节数组时,我看到了不同的数据 此代码中唯一的更改是将NSUTF8StringEncoding更改为NSUnicodeEncoding,并添加dataLength+=2,以便它考虑BOM NSString *message = @"testing"; NSUInteger dataLength = [mess

我正在尝试将NSStrings转换为字节数组,然后再转换回NSStrings。我尝试过NSUTF8StringEncoding和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++;
}
NSString*消息=@“测试”;
NSUTInteger dataLength=[message LengthofBytes SusingEncoding:NSUTF8StringEncoding];
void*byteData=malloc(数据长度);
NSRange range=NSMakeRange(0,[消息长度]);
BOOL result=[message getBytes:byteData maxLength:dataLength usedLength:&actualLength编码:NSUTF8StringEncoding选项:0范围:范围剩余范围:&Remaining];
对于(整数x=0;x
不同之处在于NSLog: 如我所见,NSUTF8StringEncoding

  • 测试`
  • 测试`
  • 刺痛`
  • 婷`
正如我所看到的那样

  • 空的
  • t
  • 空的
  • e

int t值对于给定的字符是正确的,但我不理解为什么byteData如此不同。我希望它们都能像nsunicode一样工作。

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


不清楚为什么你看到的行为与你期望的不完全一样。在UTF-8中,标准ASCII字符占用一个字节。在Unicode编码中,字符占用两个字符。因此,它肯定是完全不同的。

根据,
nsunicoding
“小尾端UTF-16前面有一个字节顺序标记”,因此应该预期结果与UTF-8完全不同。

您理解UTF-8和UTF-16作为表示的区别吗?我不知道为什么你会期望它们相似……我只是在学习,但我确实理解其中的一些差异。我的问题是为什么记录的数据如此不同。我假设我一次记录一个字节,不明白多个字符怎么可能是一个字节。相反,你一次记录一个字节,但每个UTF-16代码单元是2个字节。我不确定我是否清楚我的意思-我不明白如何调用Log(@“byte data:%s”,(char*)byteData);我以为每次记录一个字节就是记录一次调用的测试。但是从David的回答来看,似乎我使用的格式说明符是不正确的。当我在字节数组中记录当前字节时,我希望它是一个字节。记录的数据(testing',esting',…)似乎在每个日志语句中都写入了一个以上的字节。错了吗?谢谢,好像是这样的。我理解指针的基本概念,但我仍然会迷失在一些符号和用法中。有趣的是,我在转换为int时使用了正确的表示法,但在记录时使用了错误的表示法。我认为这是因为UTF-16数据的日志记录工作正常——正如您所说,每隔一个位置都有nul字节。再次感谢。