NSStream,UTF8String& NSString ......凌乱的转换

时间:2009-06-16 16:41:51

标签: iphone utf-8 nsstring nsstream

我正构建一个通过NSStream发送到服务器的数据包。我试图用'§'(ascii代码167)分隔两个数据。这是服务器的构建方式,所以我需要尽量保持在这些范围内......

unichar asciiChar = 167;  //yields @"§"
[self setSepString:[NSString stringWithCharacters:&asciiChar length:1]]; 

sendData=[NSString stringWithFormat:@"USER User%@Pass", sepString];

NSLog(sendData);

const uint8_t *rawString=(const uint8_t *)[sendData UTF8String];

[oStream write:rawString maxLength:[sendData length]];  

所以最终的结果应该是这样的......当sendData首次构建时它会这样做:

USER User§Pass 

但是,当它在服务器端收到时,它看起来像这样:

//not a direct copy and paste. The 'mystery character' may not be exact
USER UserˤPas

...分隔符字符串的长度变为两个,最后一个字母将从命令中被裁剪掉。我认为这是UTF8转换的原因。

有人能为我解释一下吗?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:6)

UTF-8中对此字符的正确编码是双字节序列0xC2 0xA7,这就是您所获得的。 (Fileformat.info对于这些东西是非常宝贵的。)这是LATIN-1集合之外的,所以你几乎肯定想要使用NSISOLatin1StringEncoding而不是NSUTF8StringEncoding来获得单字节167编码。看看NSString -dataUsingEncoding:

答案 1 :(得分:1)

你拥有的和你想要传输的东西不是真正的UTF-8字符串,而且技术上不是us-ascii,因为它只有7位。您希望根据您正在使用的协议传输任意字节数组。字节数组的两个字段,用户名和密码,本身可能是UTF-8字符串,但使用167分隔符时,它不能是UTF-8字符串。

以下是我看到的一些选项:

  • 使用至少两个不同的uint8_t*个对象和NSString代码构造167字节数组。如果用户名或密码可能包含非ascii字符,则必须这样做。
  • 使用NSString方法getBytes:maxLength:usedLength:encoding:options:range:remainingRange并将encoding设置为NSASCIIStringEncoding。如果您这样做,您必须在其他地方验证您的用户名和密码是否为us-ascii。
  • 使用NSString方法getCString。但是,由于您无法指定所需的编码,因此已弃用。