2011-09-28 57 views
5

Tôi biết rằng để có được một ký tự unicode trong C++ Tôi có thể làm:Làm cách nào để lặp qua các ký tự unicode trong C++?

std::wstring str = L"\u4FF0"; 

Tuy nhiên, những gì nếu tôi muốn có được tất cả các nhân vật trong phạm vi 4FF0 để 5FF0? Có thể tự động xây dựng một ký tự unicode?

for (int i = 20464; i < 24560; i++ { // From 4FF0 to 5FF0 
    std::wstring str = L"\u" + hexa(i); // build the unicode character 
    // do something with str 
} 

Làm thế nào tôi sẽ làm điều đó trong C++: một cái gì đó giống như pseudo-code này những gì tôi có trong tâm trí là gì?

Trả lời

9

Loại wchar_t tổ chức trong vòng một wstring là một kiểu số nguyên, vì vậy bạn có thể sử dụng nó trực tiếp:

for (wchar_t c = 0x4ff0; c <= 0x5ff0; ++c) { 
    std::wstring str(1, c); 
    // do something with str 
} 

Hãy cẩn thận cố gắng để làm điều này với các nhân vật trên 0xffff, vì tùy thuộc vào nền tảng (chẳng hạn Windows) họ sẽ không phù hợp với một wchar_t.

Nếu ví dụ bạn muốn để xem Emoticon block trong một chuỗi, bạn có thể tạo cặp thay thế:

std::wstring str; 
for (int c = 0x1f600; c <= 0x1f64f; ++c) { 
    if (c <= 0xffff || sizeof(wchar_t) > 2) 
     str.append(1, (wchar_t)c); 
    else { 
     str.append(1, (wchar_t)(0xd800 | ((c - 0x10000) >> 10))); 
     str.append(1, (wchar_t)(0xdc00 | ((c - 0x10000) & 0x3ff))); 
    } 
} 
+0

Có một giải pháp dễ dàng để codepoints> 0xffff? –

+1

@Captain Giraffe, nếu loại wchar_t của bạn lớn hơn 16 bit thì sẽ không có vấn đề gì. Nếu không, bạn phải chia thành hai ký tự wchar_t theo quy tắc [UTF-16] (http://en.wikipedia.org/wiki/Utf-16). –

+1

Nếu hôm nay là ngày hôm qua, kiểu này sẽ được gọi là byte, chứ không phải char =) Đồng thời, từ "lò xo" đến tâm trí –

2

gì về:

for (std::wstring::value_type i(0x4ff0); i <= 0x5ff0; ++i) 
{ 
    std::wstring str(1, i); 
} 

Lưu ý rằng mã chưa được thử nghiệm, vì vậy nó có thể không biên dịch như nó vốn có.

Ngoài ra, với nền tảng bạn đang làm việc trên đơn vị ký tự của wstring có thể rộng 2, 4 hoặc N byte, vì vậy hãy cố ý về cách bạn sử dụng nó.

+0

thay thế 'char_type' bằng' value_type' và nó sẽ biên dịch. – Cubbi

+0

@Cubbi: Xong, cảm ơn. – fbrereto

4

Bạn không thể thặng dư trên các ký tự Unicode như thể nó là một mảng, một số nhân vật được xây dựng ra khỏi nhiều 'char's (UTF-8) và nhiều' WCHAR's (UTF-16) đó là do dấu phụ vv Nếu bạn thực sự nghiêm túc về công cụ này, bạn nên sử dụng một API như UniScribe hoặc ICU.

Một số nguồn lực để đọc:

http://en.wikipedia.org/wiki/UTF-16/UCS-2

http://en.wikipedia.org/wiki/Precomposed_character

http://en.wikipedia.org/wiki/Combining_character

http://scripts.sil.org/cms/scripts/page.php?item_id=UnicodeNames#4d2aa980

http://en.wikipedia.org/wiki/Unicode_equivalence

http://msdn.microsoft.com/en-us/library/dd374126.aspx

+1

Câu lệnh đầu tiên là chính xác; lý do không. UTF-8 và UTF-16 là mã hóa, và trực giao với các điểm mã. Dấu phụ cũng là các điểm mã, vì vậy chúng cũng độc lập với UTF-8 và -16 – MSalters

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