2011-02-01 41 views
13

我知道所有關於std :: string和std :: wstring,但他們似乎沒有完全關注UTF-8和UTF-16的擴展字符編碼(至少在Windows上)。也不支持UTF-32。有沒有正確處理Unicode的STL字符串類?

那麼有誰知道跨平臺的嵌入式替換類可以提供完整的UTF-8,UTF-16和UTF-32支持嗎?

回答

9
用C

嘛++ 0x中存在着階級的std :: u32string和std :: u16string。海灣合作委員會已經部分支持他們,所以你可以使用它們,但流支持unicode尚未完成Unicode support in C++0x

+0

嗯,我沒有注意到,在新的標準。很有意思。非常遺憾,我不能在缺乏C++ 0x支持的編譯器上使用它(例如iPhone編譯器)。真正讓我感到震驚的是,這些課程還不存在...... – Goz 2011-02-01 12:10:35

+0

有趣的是,GCC> 4.4和VS2010似乎都支持它。這是輝煌的。在涵蓋windows,linux和Android移動平臺的主要平臺上。鏗也表示,「很多」的例子工作... – Goz 2011-02-01 12:15:39

7

這不是STL,但如果你想在C++中使用正確的Unicode,那麼你應該看看ICU

+0

看起來很有意思。可惜它沒有STL字符串支持,儘管...在這種情況下它將是完美的...... – Goz 2011-02-01 11:37:01

+0

瞭解它,但是花了一些時間和DB2之後,在接觸任何來自IBM的東西之前,我會考慮三次。你有沒有使用它?好嗎? – davka 2011-02-01 13:21:49

+1

@Goz:我完全同意,unicode足夠「標準化」,我們可能希望這個字符串不僅僅是存儲字節序列...... – 2011-02-01 13:21:50

3

在STL上不支持UTF-8。作爲替代方案可以優爾使用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

儘管它不是一個真正的sropin替換;)理想情況下,我希望看到像std :: string8,std :: string16和std :: string32 ... – Goz 2011-02-01 11:43:56

2

對於UTF-8支持,有Glib::ustring類。它是在std::string之後建模的,但是是utf-8知道的,例如。當你用迭代器掃描字符串時。它也有一些限制,例如迭代器總是const,因爲替換字符可以改變字符串的長度,所以它可以使其他迭代器無效。

ustring不會自動將其他編碼轉換爲utf-8,Glib庫對此有各種conversion functions。你可以驗證字符串是否是一個有效的utf-8。

而且還ustringstd::string是可以互換的,即ustring有投運營商的std :: string這樣你就可以通過一個ustring爲其中一個std::string預期參數,反之亦然當然,作爲ustring可以構造從std::string

11

讓我們不要忘記輕量級的,非常用戶友好的只有標題的UTF-8庫UTF8-CPP。不是替代品,但可以與std::string一起使用,並且沒有外部依賴性。

2

Qt有QString在內部使用UTF-16,但有方法轉換爲或從std :: wstring,UTF-8,Latin1或區域設置編碼轉換。還有QTextCodec類可以將QStrings轉換爲基本上任何東西。但對於字符串使用Qt似乎對我來說太過分了。