2012-01-13 101 views
7

我是Objective-C的新手,嘗試使用apples docs上的示例將畸形的UTF8編碼的NSString轉換爲格式良好的UTF8。使用NSString解碼UTF8

NSString *theString = @"Lügen"; //should be "ü" 
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding]; 

NSLog(@"Original: %@ (length %d)", theString, [theString length]); 
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]); 

結果:

Original: Lügen (length 6) 
Converted: LA1/4gen (length 8) 

在這裏,這是做什麼:

NSString* str = [NSString stringWithUTF8String: 
       [theString cStringUsingEncoding:NSASCIIStringEncoding]]; 

這在這裏崩潰我的應用程序

NSString* str = [NSString stringWithUTF8String: 
       [theString cStringUsingEncoding:NSUTF8StringEncoding]]; 

任何人任何想法,我做錯了什麼?

+0

您可以將字符串轉儲爲十六進制嗎?我不會閱讀畸形的UTF8流利:) – 2012-01-13 11:47:18

+0

這是一個「ü」不知道如何獲得十六進制值;) – 2012-01-13 11:52:49

+0

請在任何涉及崩潰的問題中發佈崩潰的細節。 – jrturton 2012-01-13 12:41:36

回答

14
NSString *string = @"ü"; 
const char *c = [string cStringUsingEncoding:NSISOLatin1StringEncoding]; 
NSString *newString = [[NSString alloc]initWithCString:c encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",newString); // ü 

「格式錯誤的UTF-8序列」表示在UTF-8中無效的字節序列。在解析字符串的原始作者所使用的編碼之外的其他編碼的字符串後,您的問題是意外的結果。

十六進制數據C3 BC解析帶有UTF-8編碼的是字符ü。相反,您使用的是Latin-1編碼,結果爲ü。然後,您從Latin-1解析的字符串創建了一個NSString,這意味着您將轉換爲 Latin-1字符串爲UTF-16字符串(這是NSString的本機格式)。

以不同的編碼表示給定的數據顯示爲不同的字符,但不會更改數據。轉換爲不同的編碼會改變數據以嘗試重現相同的字符。示例:字符ü爲UTF-8中的C3 83 C2 BC,但拉丁語-1中爲C3 BC。所以我轉換爲Latin-1中的相同字符以獲取原始數據,然後我解析爲UTF-8。

+0

非常感謝你:) – 2012-01-15 16:42:33