1

理解できない奇妙なテキストエンコーディングの問題があります。奇妙なことに、ブラウザのAPIフィードからオンラインでテキストをチェックアウトする場合、テキストをフォーマットする必要はありません。

これが私のコードです:

-(void) viewDidLoad {

    [super viewDidLoad];

  NSString *jsonDealString = [NSString stringWithFormat:@"http://api.*****"];

    NSLog(@"deal id is %@",dealId);

    // Download the JSON
    NSString *jsonString = [NSString
                            stringWithContentsOfURL:[NSURL URLWithString:jsonDealString]
                            encoding:NSStringEncodingConversionAllowLossy|NSUTF8StringEncoding
                            error:nil];

    // Create parser for the api
    SBJSON *parser = [[SBJSON alloc] init];
    NSDictionary *results = [parser objectWithString:jsonString error:nil];

    [self setDisplayItems:[results objectForKey:@"results"]];

    NSDictionary *item = (NSDictionary *)[displayItems objectAtIndex:0];

    self.titleDeal.text = [item objectForKey:@"title"];

}

私は以下を使用してテキストエンコーディングの問題を修正することができました:

 // merchant name with encoding fix
NSString *correctStringTitleDeal = [NSString stringWithCString:[[[item objectForKey:@"merchant"] objectForKey:@"name"] cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
self.titleDeal.text = correctStringTitleDeal;

しかし、Nullオブジェクトが検出されたときにクラッシュが発生しました。

クラッシュログの出力状態:

*キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了しています、理由:'* + [NSString stringWithCString:encoding:]:NULL cString'

これは、テーブルビューで発生している問題のスクリーンショットです(アプリの他の場所でも発生しています)。

ここに画像の説明を入力してください

助けてくれてありがとう

4

2 に答える 2

1

簡単な答え:APIの文字列エンコーディングを見つけて使用します。

長い答え:

エンコーディングの問題の最も可能性の高い原因は、JSONがUTF-8にないことです。JSONは、仕様により何らかの形式のUnicodeである必要があります(RFC4627セクション3を参照)。speicifcエンコーディングは、最初の4オクテットによって決定されます。繰り返しますが、仕様を参照してください。

あなたの通過NSStringEncodingConversionAllowLossyは非常に疑わしいです。非可逆変換を許可するべきではありません。APIの特定のエンコーディングを知っている必要があり、それを使用する必要があります。同様に、他のサンプルコードのエンコーディングをに切り替えますNSISOLatin1StringEncoding。これは一部のUnicodeに似ていますが、JSONには使用しないため、Unicodeエンコーディングではありません。

もちろん、この特定のAPIが仕様に違反しており、正しくエンコードされていないJSONを送信している可能性があります。APIプロバイダーと協力してJSONを修正するか、APIプロバイダーが提供するエンコーディングを使用することができます。ただし、推測するべきではなく、損失の多い変換を受け入れるべきではありません。

于 2013-02-05T21:20:20.890 に答える
1

クラッシュは、オブジェクトではなく c-string にメッセージを送信しているためです。cstringUsingEncoding: c-string を提供し、encode のようなことはできません:

エンコードの問題については、ブラウザーを使用して API からのテキストを適切に読み取ることができる場合、テキストは UTF8 形式の Unicode ではなく HTML にエンコードされます。

于 2013-02-05T20:47:12.353 に答える