2009-07-22 6 views
5

Tôi muốn tạo một mảng các ký tự Unicode, nhưng tôi không biết cách chuyển đổi các số nguyên thành một biểu diễn Unicode. Dưới đây là đoạn code tôi có cho đến nayLàm cách nào để tạo các ký tự unicode từ số nguyên?

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0]; 
int i; 

for (i = 32; i < 300; i++) { 
    NSString *uniString = [NSString stringWithFormat:@"\u%04X", i]; 
    [uniArray addObject:uniString]; 
} 

nào mang lại cho tôi một lỗi "không đầy đủ tên ký tự \ u"

Có cách nào tốt hơn để xây dựng một loạt các ký tự Unicode? Cảm ơn.

Trả lời

7

Bạn nên sử dụng% C để chèn một ký tự unicode:

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0]; 
int i; 

for (i = 32; i < 300; i++) { 
    NSString *uniString = [NSString stringWithFormat:@"%C", i]; 
    [uniArray addObject:uniString]; 
} 

Một cách khác (? Tốt hơn) là sử dụng stringWithCharacters:

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0]; 
int i; 

for (i = 32; i < 300; i++) { 
    NSString *uniString = [NSString stringWithCharacters:(unichar *)&i length:1]; 
    [uniArray addObject:uniString]; 
} 
+0

Tuyệt vời, cảm ơn những điều này. Tôi đã sử dụng cái đầu tiên, đó chỉ là thứ tôi cần. –

+0

Sự khác biệt chính là '% C' có một' wchar_t', là (hiện tại và trên Mac OS X) 32-bit, vì vậy bạn đang chuyển UTF-32 ở đó. 'stringWithCharacters:' lấy UTF-16. –

1

Nếu bạn muốn có một nhân vật UTF-16 duy nhất, [NSString stringWithCharacters:&character length:1] . Nếu đó là UTF-32, bạn phải chuyển đổi thành các cặp thay thế hoặc sử dụng -initWithData:encoding: hoặc thử Philippe đã nói (Tôi không chắc chắn liệu bộ xử lý UTF-32 đó có phù hợp hay không).

2

Lý do lỗi là \u phải được theo sau bởi bốn chữ số thập lục phân tại thời gian biên dịch. Bạn đã theo dõi nó với “%04x”, rõ ràng với mục đích chèn bốn số thập lục phân vào thời gian chạy, đã quá muộn - trình biên dịch từ lâu đã hoàn thành công việc của nó sau đó, và trình biên dịch là gì lỗi này.

0

Một ví dụ khác về việc sử dụng Regex:

Yêu cầu RegexKitLite. Sử dụng regex (?s). để chia chuỗi ký tự unicode thành NSArray. Toán tử regex . khớp với mọi thứ nhưng ký tự dòng mới theo mặc định và chuỗi (?s) cho biết Turn on the Dot All regex option cho phép . cũng khớp với ký tự dòng mới. Quan trọng vì chúng tôi rõ ràng vượt qua ít nhất \n trong ví dụ bên dưới.

#import <Foundation/Foundation.h> 
#import "RegexKitLite.h" 

// Compile with: gcc -std=gnu99 -o unicodeArray unicodeArray.m RegexKitLite.m -framework Foundation -licucore 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    unichar uc[1024]; 
    for(NSUInteger idx = 0UL; idx < 1024UL; idx++) { uc[idx] = (unichar)idx; } 
    NSArray *unicharArray = [[NSString stringWithCharacters:uc length:1024UL] componentsMatchedByRegex:@"(?s)."]; 

    NSLog(@"array: %@", [unicharArray subarrayWithRange:NSMakeRange(32UL, (1024UL - 32UL))]); 

    [pool release]; 
    return(0); 
}