2011-01-06 40 views
5

Tôi có một danh sách các unicode char "mã" mà tôi muốn in bằng \u dãy thoát (ví dụ \ue415), ngay sau khi tôi cố gắng soạn nó với một cái gì đó như thế này:Soạn định dạng char unicode cho NSString

// charCode comes as NSString object from PList 
NSString *str = [NSString stringWithFormat:@"\u%@", charCode]; 

trình biên dịch cảnh báo tôi về mã ký tự không đầy đủ. Bất cứ ai có thể giúp tôi với nhiệm vụ tầm thường này?

+0

Bạn muốn biểu tượng unicode đầu ra với mã đã cho? – Vladimir

+0

Có và tôi đã thử trình giữ chỗ '% C' không có may mắn. – Eimantas

Trả lời

14

Tôi nghĩ bạn không thể làm điều đó theo cách bạn đang cố gắng - Trình tự thoát \ uxxx được sử dụng để chỉ ra rằng hằng số là một ký tự unicode - và chuyển đổi đó được xử lý tại thời gian biên dịch.

gì bạn cần là để chuyển đổi charCode của bạn đến một số nguyên và sử dụng giá trị như tham số định dạng:

unichar codeValue = (unichar) strtol([charCode UTF8String], NULL, 16); 
NSString *str = [NSString stringWithFormat:@"%C", charCode]; 
NSLog(@"Character with code \\u%@ is %C", charCode, codeValue); 

Xin lỗi, đó nust không phải là cách tốt nhất để nhận được giá trị int từ đại diện HEX, nhưng đó là ngày 1 mà đến tâm

Edit: dường như NSScanner lớp có thể quét NSString cho số trong biểu hex:

unichar codeValue; 
[[NSScanner scannerWithString:charCode] scanHexInt:&codeValue]; 
... 
+0

mà thực sự đã làm các trick! cảm ơn! – Eimantas

+0

Đây là trợ giúp tuyệt vời! Điều duy nhất là tôi nhận được một cảnh báo trên dòng thứ hai như rõ ràng unichar không phải là một loại hợp lệ cho các đối số đi qua của các scanHexInt: chức năng. Nó vẫn hoạt động, nhưng là một cảnh báo gây phiền nhiễu. – Zebs

+0

Bạn cần sử dụng một chút thao tác byte để có cách tiếp cận NSScanner này hoạt động với các giá trị unicode cao hơn> UFFFF ... xem http://stackoverflow.com/a/15133359/2308190 –

1

Hãy coi chừng rằng không phải tất cả các ký tự đều có thể được mã hóa bằng UTF-8. Tôi đã có một lỗi ngày hôm qua, nơi một số ký tự Hàn Quốc đã không được mã hóa trong UTF-8 đúng cách.

Giải pháp của tôi là thay đổi chuỗi định dạng từ% s thành% @ và tránh vấn đề mã hóa lại, mặc dù điều này có thể không hiệu quả với bạn.

+0

Đúng, nhưng ở đây utf-8 được sử dụng chỉ để chuyển đổi chuỗi đại diện của mã ký tự thành giá trị nguyên của nó, kết quả là chuỗi có thể yêu cầu được xử lý như chuỗi unicode – Vladimir

+0

Vấn đề tôi đang gặp phải là mã hóa UTF-8 có chứa các ký tự rỗng được nhúng, vì vậy strtol sẽ không cung cấp cho bạn những gì bạn đang mong đợi. – Mark

+0

Tôi muốn hiển thị lại các ký tự biểu tượng cảm xúc từ url này: http://pukupi.com/post/1964/ và mã của Vladimir đã thực hiện công việc. Vì vậy, tôi đoán tôi ra khỏi phạm vi của vấn đề này. Cảm ơn bạn đã nhập liệu! – Eimantas

0

Dựa trên mã từ @Vladimir, công trình này cho tôi:

NSUInteger codeValue; 
[[NSScanner scannerWithString:@"0xf8ff"] scanHexInt:&codeValue]; 
NSLog(@"%C", (unichar)codeValue); 

không dẫn bởi "\ u" hoặc "\\ u", từ API doc:

The hexadecimal integer representation may optionally be preceded 
by 0x or 0X. Skips past excess digits in the case of overflow, 
so the receiver’s position is past the entire hexadecimal representation. 
Các vấn đề liên quan