2011-02-01 30 views
13

Tôi biết tất cả về std :: string và std :: wstring nhưng chúng dường như không hoàn toàn chú ý đến mã hóa ký tự mở rộng của UTF-8 và UTF-16 (Trên cửa sổ ít nhất). Cũng không có hỗ trợ cho UTF-32.Có một lớp chuỗi STL xử lý đúng Unicode không?

Vì vậy, có ai biết về các lớp thay thế thả xuống đa nền tảng cung cấp hỗ trợ UTF-8, UTF-16 và UTF-32 đầy đủ không?

Trả lời

9

Vâng trong C++ 0x có lớp std :: u32string và std :: u16string. GCC đã hỗ trợ một phần cho họ, vì vậy bạn đã có thể sử dụng chúng, nhưng các luồng hỗ trợ cho unicode vẫn chưa được thực hiện Unicode support in C++0x.

+0

Hmm Tôi đã không nhận thấy rằng trong tiêu chuẩn mới. Rất thú vị. Một sự xấu hổ lớn mà tôi không thể sử dụng nó trên các trình biên dịch thiếu hỗ trợ C++ 0x (chẳng hạn như trình biên dịch iPhone). Nó thực sự gây sốc cho tôi rằng những lớp này không tồn tại ... – Goz

+0

Thật thú vị, mặc dù, có vẻ như GCC> 4.4 và VS2010 đều hỗ trợ nó. Đó là rực rỡ. Trên các nền tảng chính bao gồm các cửa sổ, Linux và nền tảng di động Android.Clang cũng nói rằng "nhiều" ví dụ làm việc ... – Goz

+2

@Goz Không phải mọi thứ đều tốt như bạn nghĩ. VS2010 hỗ trợ các chuỗi unicode, nhưng nó không hỗ trợ các chuỗi ký tự unicode. u "Hello" là chuỗi UTF-16 và U "Hello" là chữ UTF-32. Visual studio không nhận ra chúng. Và cũng như tôi đã nói gcc không hỗ trợ đầu vào, dòng đầu ra nào được nêu ra. – UmmaGumma

7

Nó không phải là STL, nhưng nếu bạn muốn Unicode đúng trong C++, thì bạn nên xem ICU.

+0

Có vẻ thú vị. Xấu hổ không có hỗ trợ chuỗi STL từ nó mặc dù ... nó sẽ là hoàn hảo trong trường hợp đó ... – Goz

+0

đọc về nó, nhưng sau khi chi tiêu một thời gian với DB2, tôi nghĩ hai lần trước khi chạm vào bất cứ điều gì đến từ IBM. Bạn đã từng làm việc với nó chưa? Liệu nó có tốt không? – davka

+1

@Goz: Tôi không thể đồng ý nhiều hơn, unicode là "chuẩn" đủ để chúng ta có thể mong muốn một chuỗi làm nhiều hơn lưu trữ các chuỗi byte ... –

3

Không hỗ trợ UTF-8 trên STL. Là một youo thay thế có thể sử dụng boost codecvt:

//... 
// My encoding type 
typedef wchar_t ucs4_t; 

std::locale old_locale; 
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>); 

// Set a New global locale 
std::locale::global(utf8_locale); 

// Send the UCS-4 data out, converting to UTF-8 
{ 
    std::wstringstream oss; 
    oss.imbue(utf8_locale); 
    std::copy(ucs4_data.begin(),ucs4_data.end(), 
     std::ostream_iterator<ucs4_t,ucs4_t>(oss)); 

    std::wcout << oss.str() << std::endl; 
} 
+0

Nó không thực sự là một sự thay thế sropin mặc dù;) Lý tưởng nhất là tôi muốn thấy một cái gì đó như std :: string8, std :: string16 và std :: string32 ... – Goz

2

Để được hỗ trợ UTF-8, có lớp Glib::ustring. Nó được mô hình hóa sau std::string nhưng là nhận thức utf-8, ví dụ: khi bạn quét chuỗi bằng trình lặp. Nó cũng có một số hạn chế, ví dụ: trình vòng lặp luôn là const, khi thay thế một ký tự có thể thay đổi độ dài của chuỗi và do đó nó có thể làm mất hiệu lực các trình lặp khác.

ustring không tự động chuyển đổi các mã hóa khác thành utf-8, Glib thư viện có nhiều loại conversion functions cho việc này. Bạn có thể xác nhận xem chuỗi có phải là utf-8 hợp lệ hay không.

Và cũng có thể, ustringstd::string là hoán đổi cho nhau, tức là ustring có một nhà điều hành đúc để std :: string để bạn có thể vượt qua một ustring như một tham số nơi một std::string dự kiến, và ngược lại tất nhiên, như ustring thể được xây dựng từ std::string.

+0

Thats gần như hoàn hảo. Xấu hổ về sự hỗ trợ unicode không 16 và 32-bit ... – Goz

11

Và đừng quên thư viện UTF-8 nhẹ, rất thân thiện với người dùng, chỉ tiêu đề UTF8-CPP. Không phải là một thay thế thả, nhưng có thể dễ dàng được sử dụng kết hợp với std::string và không có phụ thuộc bên ngoài.

+0

Đây là một thư viện nhỏ đẹp :) – Skurmedel

2

Qt có QString sử dụng UTF-16 trong nội bộ, nhưng có phương pháp để chuyển đổi hoặc từ mã hóa std :: wstring, UTF-8, Latin1 hoặc ngôn ngữ. Ngoài ra còn có các lớp QTextCodec có thể chuyển đổi QStrings đến hoặc từ cơ bản bất cứ điều gì. Nhưng sử dụng Qt cho các chuỗi chỉ có vẻ giống như một overkill cho tôi.

+0

Vâng, than ôi, bạn hoàn toàn đúng khi sử dụng nó hoàn toàn cho chuỗi. Tôi thích qt mặc dù và sử dụng nó cho khá một chút :) – Goz

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