web-dev-qa-db-ja.com

Objective CでのUTF8文字のデコード

IPhoneでjson Webサービスからのフィードを解析しようとしていますが、utf8変換が正常に機能していないか、何か問題がありますここにフィードの一部があります
est un r\u00c3\u00aave en noir

上記を変換するために私が書いたコードは次のとおりです。

NSString* str1 = @"est un r \u00c3\u00aa ve en noir";

NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"Converted UTF   %@",str);

これは私が得ている出力です:
Converted UTF est un r ê ve en noir

期待される出力は
Converted UTF est un rêve en noir

UTFテーブルを確認し、オンラインでutfコンバーターを使用すると、出力は同じコードで正しく取得され、文字列@"est un r\u00EAve en noir"が使用されますが、間違いがない場合はUTF16表現だと思います。このフィードを解析する方法を修正しました。

21
Gaurav Ghate

多くの悲しみの後、私はこれを理解しました。これを使って。

NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];

テストケースは壊れていると思います。以下:

NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
NSLog(@"%@", str1);

「est un r ve ve en noir」も出力します。ただし、これ:

NSString* str1 = @"est un rêve en noir";
NSLog(@"%@", str1);

次のように、「est unrêveen noir」を出力します。

NSString* str1 = @"est un rêve en noir";

NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%@", str);

そして、少し短いバージョンの同上:

NSString* str1 = @"est un rêve en noir";

NSString* str = [NSString stringWithUTF8String:[str1 UTF8Encoding]];
NSLog(@"%@", str);

本当に:

char *str1 = "est un r\xc3\xaave en noir";

NSString* str = [NSString stringWithUTF8String:str1];
NSLog(@"%@", str);

UTF8ではなく、JSONの問題だと思います。\uの後に4桁の16進数字が続くのは、JSONが汎用UTF16文字をエンコードする方法であり、UTFの固有の部分ではありません。したがって、NSStringはそれを処理する方法を知りません。エスケープシーケンスを適切に解析するには、JSONパーサーを調整する必要があります。

10
Tommy

IOS 9では何もする必要はありません。自動的に変換されます。

   NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request
                                                               fromData:postData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

                                                                   NSLog(@"response header: %@",response);

                                                                   NSString* aStr;
                                                               aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                                               NSLog(@"response data: %@", aStr);

                                                               NSDictionary * json  = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

                                                               for (NSDictionary *dict in json)
                                                               {
                                                                   NSLog(@"%@", dict);
                                                                   NSString *name = [dict objectForKey:@"name"];
                                                                   NSString *msg = [dict objectForKey:@"message"];
                                                                   NSString *topic = [dict objectForKey:@"topic"];
                                                                   NSLog(@"*********** %@, %@, %@", name,topic,msg);

                                                                   // now do something
                                                                   }
0
dip

サーバーに送信中

NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
    NSData *str1Data = [str1 dataUsingEncoding:NSNonLossyASCIIStringEncoding];
    NSString  *str2 = [[NSString alloc] initWithData:str1Data encoding:NSUTF8StringEncoding];

受信後、このようにデコードできます

NSData *recivedStrData = [recivedStr dataUsingEncoding:NSUTF8StringEncoding];
    NSString *strResult = [[NSString alloc] initWithData:recivedStrData encoding:NSNonLossyASCIIStringEncoding];

これは私にとってはうまくいきます!

0
Sandeep Khade