NSStream,UTF8字符串和的NSString ...凌乱的转换(NSStream, UTF8

2019-06-23 09:49发布

我在构建以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]];  

所以,最后的结果应该是这样..它确实时送出数据首先构造:

USER User§Pass 

然而,当在服务器端收到的,它看起来像这样:

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

...的分隔符字符串已成为两个长度,和最后一个字母正从命令裁剪。 我相信这是由UTF8转换的原因。

任何人都可以提供一些线索这对我来说?

任何帮助将不胜感激!

Answer 1:

在UTF-8的这种性格正确的编码是两个字节为0xC2 0xA7,这是你在说什么。 ( Fileformat.info是宝贵的这种东西)。这是出了LATIN-1套,让你几乎肯定要使用NSISOLatin1StringEncoding而不是NSUTF8StringEncoding为了得到一个单字节编码167。 看NSString -dataUsingEncoding:



Answer 2:

你有什么,你想传递的是不是一个真正的UTF-8字符串,它在技术上不是US-ASCII,因为这是只有7位。 你要传输的字节的任意阵列,根据您正在使用的协议。 字节数组,用户名和密码的两个领域,本身可能是UTF-8串,但与167分隔它不能是UTF-8字符串。

这里有一些选择我看到:

  • 构建uint8_t*使用至少两个不同的字节数组NSString对象加上167的代码。 这将是必要的,如果用户名和密码都不可能包含非ASCII字符。
  • 使用NSString方法getBytes:maxLength:usedLength:encoding:options:range:remainingRange和设置encodingNSASCIIStringEncoding 。 如果你这样做,你必须验证其他地方你的用户名和密码是唯一的US-ASCII。
  • 使用NSString方法getCString 。 然而,这遭到反对,因为你不能指定所需的编码。


文章来源: NSStream, UTF8String & NSString… Messy Conversion