2012-01-13 33 views
7

Tôi mới dùng Objective-C và cố gắng chuyển đổi một NSString được mã hóa UTF8 không đúng định dạng thành một dạng được định dạng tốt bằng ví dụ trên apples docs.Giải mã UTF8 với NSString

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

Kết quả:

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

này ở đây là không làm gì cả:

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

này đây bị treo ứng dụng của tôi

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

Bất cứ ai bất kỳ ý tưởng những gì tôi đang làm sai?

+0

Bạn có thể kết xuất chuỗi dưới dạng hex không? Tôi không đọc UTF8 bị biến dạng thành thạo :) –

+0

đây là "ü" không biết cách lấy giá trị hex;) –

+0

Vui lòng đăng chi tiết về sự cố trong bất kỳ câu hỏi nào liên quan đến sự cố. – jrturton

Trả lời

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

"Trình tự UTF-8 không đúng định dạng" có nghĩa là một chuỗi các byte không hợp lệ trong UTF-8. Vấn đề của bạn là kết quả không mong muốn sau khi phân tích chuỗi bằng mã hóa khác với chuỗi được sử dụng bởi tác giả gốc của chuỗi.

Dữ liệu thập lục phân C3 BCđược phân tích cú pháp với mã hóa UTF-8 là ký tự ü. Thay vào đó, bạn đã sử dụng mã hóa Latin-1, kết quả là ü. Sau đó, bạn đã tạo một NSString từ chuỗi phân tích cú pháp Latin-1, có nghĩa là bạn chuyển đổi chuỗi Latinh-1 thành chuỗi UTF-16 (là định dạng gốc của NSString).

Trình bày dữ liệu đã cho trong các mã hóa khác nhau hiển thị dưới dạng ký tự khác nhau, nhưng không thay đổi dữ liệu. Việc chuyển đổi sang một mã hóa khác sẽ thay đổi dữ liệu trong nỗ lực tái tạo các ký tự giống nhau. Ví dụ: Ký tự üC3 83 C2 BC bằng UTF-8, nhưng C3 BC bằng tiếng Latinh-1. Vì vậy, tôi đã chuyển đổi thành cùng một ký tự trong tiếng Latin-1 để lấy dữ liệu gốc, và sau đó tôi phân tích cú pháp là UTF-8.

+0

cảm ơn bạn rất nhiều :) –

Các vấn đề liên quan