2012-09-14 29 views
5

Có ai cho tôi biết nguyên nhân của sự khác biệt cho các kết quả sau không?Lỗi iOS NSLog với các ký tự Unicode

completionHandler:^(NSArray *placemarks, NSError *error) { 
    NSLog(@"\n placemarks%@", placemarks); 

kết quả:

placemarks(
"\U039b\U03b5\U03c9\U03c6\U03cc\U03c1\U03bf\U03c2 \U039a\U03cd\U03c0\U03c1\U03bf\U03c5 163, 16451 \U0391\U03c1\U03b3\U03c5\U03c1\U03bf\U03cd\U03c0\U03bf\U03bb\U03b7\U03c2, \U0395\U03bb\U03bb\U03ac\U03c2 @ <+37.90085408,+23.75654648> +/- 100.00m, region (identifier <+37.90085408,+23.75654648> radius 141.62) <+37.90085408,+23.75654648> radius 141.62m" 
) 

for(id object in placemarks) {NSLog(@"%@ \n", object);} 

Kết quả

2012-09-14 13:08:23.493 ΑΦΜ[1390:c07] Λεωφόρος Κύπρου 163, 16451 Αργυρούπολης, Ελλάς @ <+37.90085408,+23.75654648> +/- 100.00m, region (identifier <+37.90085408,+23.75654648> radius 141.62) <+37.90085408,+23.75654648> radius 141.62m 

Cảm ơn bạn

Trả lời

6

Thú vị :)

Chuyển số %@ thành chuỗi NSLog 'có nghĩa là' gọi description trên một đối tượng '.

Dường như description trên NSArray xử lý các ký tự unicode khác với description trên mỗi đối tượng.

Tuy nhiên, tôi nghi ngờ rằng phương pháp mô tả trên NSArray chỉ mô tả cuộc gọi trên mỗi đối tượng chứa và sau đó, vì lý do nào đó tôi không chắc chắn 100%, hãy mã hóa chúng trước khi bán chúng ra NSLog.

3

Chuyển %@ đến NSLog không gọi số [NSArray description] trên mảng. NSArray class reference nói rằng [NSArray description] "trả về một chuỗi đại diện cho nội dung của mảng, được định dạng dưới dạng danh sách thuộc tính". Làm như vậy sẽ chuyển đổi các ký tự unicode thành NSNonLossyASCIIStringEncoding. NSArray của bạn sẽ in chính xác nếu bạn đảo ngược quá trình.

completionHandler:^(NSArray *placemarks, NSError *error) { 
     NSLog(@"%@", [NSString stringWithCString:[[placemarks description] cStringUsingEncoding:NSASCIIStringEncoding] encoding:NSNonLossyASCIIStringEncoding]); 

này hoạt động bằng cách chuyển đổi chuỗi gốc với tất cả các nhân vật phổ \ uXXXX mã hóa thành một chuỗi c, sau đó giải mã chuỗi c đến một NSString đảo ngược NSNonLossyASCIIStringEncoding vốn đã được thực hiện bởi các [NSLog description]. Tôi đã không tìm ra cách để làm điều này mà không cần chuyển đổi thành chuỗi c.