Objective C - 通过编码使用NSUTF8StringEncoding将数据转换为NSString时的问题

时间:2011-06-15 08:22:42

标签: iphone objective-c nsstring

我正在尝试读取从iphone上的Java服务器发送的UTF-8数据

            uint8_t buf[1024];

            unsigned int len = 0;

            len = [(NSInputStream *)stream read:buf maxLength:1024];

            if(len) {

用这个:

NSString *chrStr = [[NSString alloc] initWithBytes:(const void *)buf length:len encoding:NSUTF8StringEncoding];

当buf的长度< 129,转换没问题。但如果长度> 129,chrStr返回null

如果我通过NSASCIIStringEncoding更改编码:

NSString *chrStr = [[NSString alloc] initWithBytes:(const void *)buf length:len encoding:NSASCIIStringEncoding];

转换没有长度&gt; 129但是UTF8字符不正确:(

抱歉我的英语。

2 个答案:

答案 0 :(得分:2)

-[NSString initWithBytes:length:encoding:NSUTF8StringEncoding]适用于长度超过129个字节的字符串。

你的问题在别处。

编辑以回答评论:

正如我所说,你的问题起源不是来自长度,而是来自其他一些问题。正如@Bavarious推测的那样,你的字符串可能不是有效的UTF-8。

以下代码按预期工作:

const char* c_string = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
NSString *string = [[[NSString alloc] initWithBytes:c_string
                                             length:strlen(c_string)
                                           encoding:NSUTF8StringEncoding] autorelease];
assert([string length] == strlen(c_string)); // only valid for ASCII

如果您仍然认为 - [NSString initWithBytes:length:encoding:]可能无法正常工作,请将代码与相关字符串一起发布。

答案 1 :(得分:1)

也许你正在将部分UTF8字符串读入“buf”。即,在下一次从流中读取时,您可能会得到一些尾随字节,因为您的UTF-8编码字符已在中间分割。