2009-06-16 52 views
1

我正在构造一个数据包,通过NSStream发送到服务器。我试图用'§'(ascii代码167)分隔两段数据。这是服务器的构建方式,所以我要尽量呆在这些界限内...NSStream,UTF8String&NSString ...凌乱的转换

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转换的原因。

任何人都可以为我介绍一些这方面的信息吗?

任何帮助将不胜感激!

+0

“'''(ascii code 167)”没有ascii code 167这样的东西。根据定义,ASCII只定义了128个字符(即只能达到127)。您的字符在某些编码中可能为167,如Latin-1。 – user102008 2011-04-29 22:08:14

回答

6

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

+0

但[NSStream写道:]明确要求UTF ...我错过了什么吗? – Dutchie432 2009-06-16 18:12:15

1

你有什么,你想要传输的不是一个真正的UTF-8字符串,它在技术上不是us-ascii,因为它只有7位。根据您正在使用的协议,您希望传输任意字节数组。字节数组,用户名和密码的两个字段本身可能是UTF-8字符串,但使用167分隔符时,它不能是UTF-8字符串。

下面是一些选项我看到:

  • 构建使用至少两个不同的对象NSString加上167代码uint8_t*字节数组。如果用户名或密码可能包含非ascii字符,则这将是必需的。
  • 使用NSString方法getBytes:maxLength:usedLength:encoding:options:range:remainingRange并将encoding设置为NSASCIIStringEncoding。如果你这样做,你必须在其他地方验证你的用户名和密码是us-ascii。使用NSString方法getCString。但是,这已被弃用,因为您无法指定所需的编码。