1

以下のコードでは、文字列の最後の文字が失われています。

NSString *testString    = @"— choose a category —";
NSData *testData        = [NSData dataWithBytes:[testString UTF8String] length:[testString length]];
NSString *newString     = [[[NSString alloc] initWithData:testData encoding:NSUTF8StringEncoding] autorelease];

デバッガーはこれを示しています:

(lldb) po testString
(NSString *) $7 = 0x002ec7f0 — choose a category —
(lldb) po testData
(NSData *) $8 = 0x1003d1c0 <e2809420 63686f6f 73652061 20636174 65676f72 79>
(lldb) po newString
(NSString *) $9 = 0x09109f50 — choose a category
(lldb) 

バイトは次のように文字に対応します。

e2 80 94 | 20 | 63 | 68 | 6f | 6f | 73 | 65 | 20 | 61 | 20 | 63 | 61 | 74 | 65 | 67 | 6f | 72 | 79 |
EM DASH  | sp |  c |  h |  o |  o |  s |  e | sp |  a | sp |  c |  a |  t |  e |  g |  o |  r |  y | sp | EM DASH

サーバーにアップロードしているのと同じ長い文字列の問題が発生しており、マルチバイトUTF8文字が常に使用されているようです。

ログに記録されたデータをサーバーからダウンロードすると、Unicode文字(切り捨てられていない)が正しく表示されます。しかし、サーバーに記録された文字列は切り捨てられ、NSDataオブジェクトに切り捨てが存在することを示しています。

私はここで何が間違っているのですか?

4

1 に答える 1

0

これが解決策です。これは他の誰かを助けるかもしれないので、質問を削除するのではなく、ここに残します.

NSData dataWithBytes:length: 結果のバイト配列の長さの値が必要です。これは、NSString がヌル終了 UTF8 表現に変換された後に決定されます。

したがって、NSData への変換は次のように正しく処理されます。

NSData *testData = [NSData dataWithBytes:[testString UTF8String] length:strlen([testString UTF8String])];

testString を 2 回変換しないようにするには、次のようにします。

const char *testStringUTF8 = [testString UTF8String];
NSData *testData = [NSData dataWithBytes:testStringUTF8 length:strlen(testStringUTF8)];

NSString クラス リファレンスでは、UTF8String メソッドによって返された C 文字列は、「返されたオブジェクトが解放されるのと同じように」処理されると述べられています。つまり、自動解放されます。(正確な表現については、クラス リファレンスを参照してください。)

于 2012-08-01T06:23:15.280 に答える