0

私はバイトとして渡しているいくつかの NSData を持っています

const void *bytes = [responseData bytes];

これらのバイトは元々UTF8でフォーマットされていましたが、エンコーディングをまったくいじらずにUTF8 NSStringに変換しようとしています。

バイトをcstringにコピーする場合、以前にこれを書きました。これは、バイトに1バイトではなく2バイトを取る英語以外の文字がない限り、通常は問題ありません。これは、文字列内の国際文字を 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 の操作を回避するために使用したコードであり、バイトを元のエンコーディングとして 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 に答える
0

私はこれを理解していません:「これは、文字列内の国際文字を cstring にコピーすると、混乱することを意味します。」「sizeWithLocalOrdering」がバイト文字列の実際の長さに対して正しい場合、元のコードは機能するはずです (ただし、strncpy ではなく memcpy を使用したはずです)。そうでなければ、何もうまくいきません。

更新: わかりました。元のコードはここで間違っていました:

[NSString stringWithCString:cstring encoding:NSUTF16StringEncoding];

それは NSUTF8StringEncoding である必要があります。

于 2012-10-26T02:43:42.823 に答える