1

我正在构建一个要通过 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 转换引起的。

任何人都可以为我阐明这一点吗?

任何帮助将不胜感激!

4

2 回答 2

6

这个字符在 UTF-8 中的正确编码是两字节序列 0xC2 0xA7,这就是你得到的。(Fileformat.info对于这些东西是无价的。)这超出了 LATIN-1 集合,所以你几乎肯定想要使用 NSISOLatin1StringEncoding 而不是 NSUTF8StringEncoding 以获得单字节 167 编码。看NSString -dataUsingEncoding:

于 2009-06-16T17:30:14.387 回答
1

你所拥有的和你想要传输的并不是真正的 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。但是,这已被弃用,因为您无法指定所需的编码。
于 2009-06-16T17:22:02.243 回答