2011-02-06 59 views
19

我試圖解析從我的iPhone上一個JSON web服務的供給解碼不過UTF8轉換是不工作的方式應該還是我做錯了什麼 這裏是分開的飼料
est un r\u00c3\u00aave en noirUTF8字符在目標C

這是我寫上面的轉換代碼:

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轉換在線的輸出是否正確使用相同的代碼,並使用字符串​​了,但我認爲,UTF-16表示如果我不是錯誤。現在我們正在修復如何解析此提要。

+0

完美的解決方案 http://stackoverflow.com/questions/6204718/status-code-0-on-google-geocode-api-from-iphone-sim-but-works-fine-on-web -non/6204970#6204970 恭喜... – Moacir 2015-04-14 13:23:40

回答

11

我覺得測試用例已經壞了;以下內容:

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

也輸出'est un r've en noir'。然而,這樣的:

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

輸出 'EST聯合國亮採EN輒',一樣:

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); 

我認爲這是一個questi對JSON,而不是UTF8。 \ u後跟四個十六進制數字是JSON編碼通用UTF16字符的方式,它不是UTF的固有部分。所以NSString不知道如何處理它。您的JSON解析器需要適應正確解析轉義序列。

+0

同意,如果json的輸出是實際的UTF-8,那就好像, – heisian 2017-02-03 19:05:29

38

經過很多的悲傷,我已經明白了這一點。用這個。

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

非常感謝,正是我一直在尋找的東西。 – Luc 2012-01-23 22:20:49

0

在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

雖然發送到服務器

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]; 

這對我的作品進行解碼後!