NSStream、UTF8String 和 NSString…混乱的转换
题
我正在构建一个数据包,通过 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 转换引起的。
有人能为我解释一下吗?
任何帮助将不胜感激!
解决方案
UTF-8中对此字符的正确编码是双字节序列0xC2 0xA7,这就是您所获得的。 ( Fileformat.info 对于这些内容非常宝贵。)这是在LATIN-1集之外,所以你几乎肯定想要使用NSISOLatin1StringEncoding而不是NSUTF8StringEncoding来获得单字节167编码。查看 NSString -dataUsingEncoding:
。
其他提示
你所拥有的和你想要传输的并不是真正的 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
. 。但是,这已被弃用,因为您无法指定所需的编码。
不隶属于 StackOverflow