我正构建一个通过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转换的原因。
有人能为我解释一下吗?
非常感谢任何帮助!
答案 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
。但是,由于您无法指定所需的编码,因此已弃用。