1

そのような文字列があるとしましょう:

NSString *someString = @"123";

次に、この文字列を NSData のインスタンスに変換します。

NSData *someData = [NSData dataWithBytes:[someString UTF8String] length:[someString length]];

私が理解している限りでは、NSData は基本的に、エンコードのないビット ストリームにすぎません。私の質問は次のとおりです: NSData は、長さパラメーターの値をチェックすることによって、各 UTF8String のビット数を決定しますか? つまり、[someString UTF8String] は文字 "123" を含む C 文字列を返し、[someString length] は整数 3 を返します。NSData は、各文字が 8 ビットで構成されている必要があることを理解していますか? 私は完全に要点を逃していますか?

ありがとうございました。

4

2 に答える 2

3

length「Unicode 文字の数」のように、文字列の長さを返します。バッキング ストアのバイト数は返しません。

NSString を NSData に変換するには、次のようなものを使用する必要があります。

NSString *someString = @"123";
NSData *someData = [someString dataUsingEncoding:NSUTF8StringEncoding];

UTF8でもASCII文字は1バイトしか占有しないため、ASCIIのみを含むUTF8で機能します。偶然にも、文字列の「論理的な」長さがバッキング ストアのサイズと一致します。

ASCII 範囲外の文字を含む文字列を試してみると、異なる結果が表示されます。

NSString *asciiString = @"123";
NSLog(@"\"%@\" - Length: %ld", asciiString, (long)[asciiString length]);
NSData *asciiData = [asciiString dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Data length: %ld", [asciiData length]);

NSString *utf8String = @"";
NSLog(@"\"%@\" - Length: %ld", utf8String, (long)[utf8String length]);
NSData *utf8Data = [utf8String dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Data length: %ld", [utf8Data length]);

utf8String = @"oö";
NSLog(@"\"%@\" - Length: %ld", utf8String, (long)[utf8String length]);
utf8Data = [utf8String dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Data length: %ld", [utf8Data length]);

収量:

"123" - Length: 3
Data length: 3
"" - Length: 2
Data length: 4
"oö" - Length: 2
Data length: 3
于 2013-11-08T07:15:40.733 に答える