2011-10-22 35 views
15

Tôi đang cố gắng đọc các chuỗi từ một mảng đến từ plist và in các chuỗi đó.Chuyển đổi các ký tự UTF8 đã thoát về hình thức ban đầu của chúng

Các chuỗi trong mảng chứa ký tự UTF8 đã thoát - ví dụ: "Nuša Florjančič" trở thành "Nu\u0161a Florjan\u010di\u010d" khi đọc từ plist. Không có cách nào để thay đổi nội dung của plist, nhưng chương trình của tôi cần hiển thị tên đúng cách.

Điều kỳ lạ là Objective-C có vẻ tự động làm điều này khi tôi mã hóa cứng chuỗi. Tuy nhiên, nếu tôi nhận được chuỗi từ plist không có gì xảy ra cả.

Để cung cấp cho bạn một ví dụ, đây là một số mã:

NSString *name1 = @"Nu\u0161a Florjan\u010di\u010d"; 
NSString *name2 = [list objectAtIndex:0];  
NSLog(@"name 1: %@", name1); 
NSLog(@"name 2: %@", name2); 

[list objectAtIndex:0] chứa @"Nu\u0161a Florjan\u010di\u010d" - sự khác biệt duy nhất là nó đã được thiết lập thông qua các biên tập viên plist.

Giao diện điều khiển đầu ra là:

2011-10-22 18:00:02.595 Test[13410:11c03] name 1: Nuša Florjančič 
2011-10-22 18:00:02.595 Test[13410:11c03] name 2: Nu\u0161a Florjan\u010di\u010d 

Tôi đã thử tất cả các loại của sự vật, bao gồm cả chuyển chuỗi thành một C-string và sau đó tạo ra một đối tượng NSString với một mã hóa UTF-8 nhưng không làm việc tại tất cả các.

Tôi thực sự đánh giá cao bất kỳ gợi ý nào từ bạn có thể giúp tôi giải quyết vấn đề dường như trần tục này.

Trả lời

41

Có vẻ như chuỗi trong plist chứa các ký tự "\ u0161" thay vì số ký tự Unicode 0x161. Vì vậy, bạn cần phải giải mã \ u thoát trong chuỗi bạn đã trích xuất từ ​​plist. NSString có thể làm điều đó cho bạn sử dụng NSNonLossyASCIIStringEncoding:

#import <Foundation/Foundation.h> 
int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     NSString *name2escaped = @"Nu\\u0161a Florjan\\u010di\\u010d"; 
     NSString *name2 = [NSString 
      stringWithCString:[name2escaped cStringUsingEncoding:NSUTF8StringEncoding] 
      encoding:NSNonLossyASCIIStringEncoding]; 
     NSLog(@"name2 = %@", name2); 
    } 
    return 0; 
} 
+0

Cảm ơn bạn rất nhiều, bạn đời! Điều đó đã làm các trick :) – Tobi

+0

Great đoạn mã. Cảm ơn bạn. –

+0

@Tobi nếu điều đó có hiệu quả, tại sao bạn không thể đánh dấu nó là câu trả lời? – DroidHeaven

1

giải pháp khác là phân tích chuỗi danh sách của bạn (tôi sử dụng để phân tích nó trước khi xây dựng nó)

NSString yourFinalString = [NSString stringWithCString:[yourOriginalString cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding]; 

(Hình như Croatia, tôi nghĩ rằng latin1 sẽ phù hợp đúng)

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