0

我有一些 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;

        }

任何帮助将不胜感激。

4

2 回答 2

0

我不明白这一点:“这意味着当我将字符串中的任何国际字符复制到 cstring 中时,它们都会变得混乱。” 如果“sizeWithLocalOrdering”对于字节字符串的实际长度是正确的,那么您的原始代码似乎应该可以工作(尽管我会使用 memcpy 而不是 strncpy)。如果没有,什么都不会起作用。

更新: 好的,我明白了。您的原始代码在这里是错误的:

[NSString stringWithCString:cstring encoding:NSUTF16StringEncoding];

那应该是 NSUTF8StringEncoding。

于 2012-10-26T02:43:42.823 回答
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
于 2012-10-28T22:25:17.257 回答