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表現だと思います。このフィードを解析する方法を修正しました。
多くの悲しみの後、私はこれを理解しました。これを使って。
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パーサーを調整する必要があります。
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
}
サーバーに送信中
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];
これは私にとってはうまくいきます!