我正在构建一个数据包,通过 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 并设置 encodingNSASCIIStringEncoding. 。如果您这样做,您必须在其他地方验证您的用户名和密码是否仅限 us-ascii。
  • 使用 NSString 方法 getCString. 。但是,这已被弃用,因为您无法指定所需的编码。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top