3

以下の方法でurlのレスポンスとして取得したものに変換NSDataしています。NSString

NSString *result = [[NSString alloc] initWithData:_Data encoding:NSUTF8StringEncoding];

それは正常に動作し、私はこれを長い間使用していますが、今日、あるページでデータをロード (ページング) しているときに問題が発生し、結果がnull文字列になりました。

だから私はSOを検索し、このリンクNSData から NSString への変換の問題からメソッドを見つけました!

[NSString stringWithCString:[theData bytes] length:[theData length]];

これはうまくいきます。

私の質問、

  1. メソッドは iOS 2.0 で廃止されました。これを使用すると、将来的に問題に直面することはありますか?
  2. これはメソッドを失敗させたテキストだと思います これはここに画像の説明を入力 何ですか? を使用してこれをエンコードできる方法はありますNSUTF8StringEncodingか?
  3. 上の写真のように、すべての種類の文字をエンコードするために使用できる代替エンコードは何ですか?
4

4 に答える 4

2

もしも

NSString *result = [[NSString alloc] initWithData:_Data encoding:NSUTF8StringEncoding];

戻りnil_DataUTF-8 エンコーディングの有効な文字列が含まれていません。

あなたが言った

[NSString stringWithCString:[theData bytes] length:[theData length]];

あなたの場合はうまくいきます。このメソッドは、データ バイトを「デフォルトの C 文字列エンコーディング」で解釈しますが、それがどのエンコーディングかは特定されていません (したがって、このメソッドは推奨されておらず、使用しないでください)。

デフォルトの C 文字列エンコーディングは、まだ "Mac Roman"だと思います。その場合

NSString *result = [[NSString alloc] initWithData:_Data encoding:NSMacOSRomanStringEncoding];

が正しい解決策になります。ただし、どのような場合でも、Web サービスが応答に使用するエンコーディングを確認し、それをinitWithData:encoding: メソッドで指定する必要があります。

于 2013-10-11T08:33:08.160 に答える
0

これは、文字列のエンコーディングが正しくないことが原因です。あなたが試すことができます:

  1. NSDataでディスクに保存しますdataPath
  2. NSStringクラス メソッドを使用して文字列を作成します。
+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

ここで注意してください:

enc

返されたときに url が正常に読み取られた場合、データの解釈に使用されるエンコーディングが含まれます。

したがって、メソッドが成功すると、正しい文字列を取得でき、すべてが iOS によって行われます。

于 2013-10-11T08:31:01.463 に答える
0

これを試して

NSString *theString = [NSString stringWithFormat:@"To be continued%C", ellipsis];

NSData *asciiData = [theString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];

NSLog(@"Original: %@ (length %d)", theString, [theString length]);
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]);
于 2013-10-11T08:25:16.777 に答える