如何使用UTF8编码将字节保存到NSString

时间:2012-10-26 01:45:01

标签: ios nsstring byte

我有一些我以字节

传递的NSData
const 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;

        }

非常感谢任何帮助。

2 个答案:

答案 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