我有一些我以字节
传递的NSDataconst void *bytes = [responseData bytes];
这些字节最初是UTF8格式的,我现在正试图将它们变成UTF8 NSString,而根本没有弄乱编码。
我之前写过这个,如果将字节复制到cstring中,通常会没问题,除非我在字节中有任何非英文字符,取两个字节而不是一个字节。这意味着当我将它们复制到cstring中时,我的字符串中的任何国际字符都会搞砸。
因此需要将字节直接复制到UTF8格式的对象中。最好是NSString ..如果可能的话。
这就是我处理转换的方式,我后来发现这是错误的,但希望能让你对我想要实现的目标有所了解。
else if (typeWithLocalOrdering == METHOD_RESPONSE)
{
cstring = (char *) malloc(sizeWithLocalOrdering + 1);
strncpy(cstring, bytes, sizeWithLocalOrdering);
cstring[sizeWithLocalOrdering] = '\0';
NSString *resultString = [NSString stringWithCString:cstring encoding:NSUTF16StringEncoding];
methodResponseData =[resultString dataUsingEncoding:NSUTF16StringEncoding]; // methodResponseData is used later on in my parsing method
// Take care of the memory allocatoin, so that you can find the endoffile notification
free(cstring);
bytes += sizeWithLocalOrdering;
length -= sizeWithLocalOrdering;
}
非常感谢任何帮助。
答案 0 :(得分:0)
我不明白这一点:“这意味着当我将它们复制到cstring中时,我的字符串中的任何国际字符都会搞砸。”如果“sizeWithLocalOrdering”对于字节字符串的实际长度是正确的,那么看起来原始代码应该可行(尽管我会使用memcpy而不是strncpy)。如果没有,没有什么可行的。
更新:好的,我明白了。你原来的代码错了:
[NSString stringWithCString:cstring encoding:NSUTF16StringEncoding];
应该是NSUTF8StringEncoding。
答案 1 :(得分:0)
事实证明我发生了一些我没想到的有趣事情......
这是我用来处理cstring的代码,只是将字节直接带到NSString作为其原始编码然后
NSString *tempstring = [[NSString alloc] initWithBytes:bytes length:sizeWithLocalOrdering encoding:NSUTF8StringEncoding];
methodResponseData =[tempstring dataUsingEncoding:NSUTF16StringEncoding]; // methodResponseData is used later on in my parsing method