我知道所有關於std :: string和std :: wstring,但他們似乎沒有完全關注UTF-8和UTF-16的擴展字符編碼(至少在Windows上)。也不支持UTF-32。有沒有正確處理Unicode的STL字符串類?
那麼有誰知道跨平臺的嵌入式替換類可以提供完整的UTF-8,UTF-16和UTF-32支持嗎?
我知道所有關於std :: string和std :: wstring,但他們似乎沒有完全關注UTF-8和UTF-16的擴展字符編碼(至少在Windows上)。也不支持UTF-32。有沒有正確處理Unicode的STL字符串類?
那麼有誰知道跨平臺的嵌入式替換類可以提供完整的UTF-8,UTF-16和UTF-32支持嗎?
嘛++ 0x中存在着階級的std :: u32string和std :: u16string。海灣合作委員會已經部分支持他們,所以你可以使用它們,但流支持unicode尚未完成Unicode support in C++0x。
在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;
}
儘管它不是一個真正的sropin替換;)理想情況下,我希望看到像std :: string8,std :: string16和std :: string32 ... – Goz 2011-02-01 11:43:56
對於UTF-8支持,有Glib::ustring類。它是在std::string
之後建模的,但是是utf-8知道的,例如。當你用迭代器掃描字符串時。它也有一些限制,例如迭代器總是const
,因爲替換字符可以改變字符串的長度,所以它可以使其他迭代器無效。
ustring
不會自動將其他編碼轉換爲utf-8,Glib
庫對此有各種conversion functions。你可以驗證字符串是否是一個有效的utf-8。
而且還ustring
和std::string
是可以互換的,即ustring
有投運營商的std :: string這樣你就可以通過一個ustring
爲其中一個std::string
預期參數,反之亦然當然,作爲ustring
可以構造從std::string
。
讓我們不要忘記輕量級的,非常用戶友好的只有標題的UTF-8庫UTF8-CPP。不是替代品,但可以與std::string
一起使用,並且沒有外部依賴性。
Qt有QString在內部使用UTF-16,但有方法轉換爲或從std :: wstring,UTF-8,Latin1或區域設置編碼轉換。還有QTextCodec類可以將QStrings轉換爲基本上任何東西。但對於字符串使用Qt似乎對我來說太過分了。
也看看http://grigory.info/UTF8Strings.About.html它是UTF8原生。
嗯,我沒有注意到,在新的標準。很有意思。非常遺憾,我不能在缺乏C++ 0x支持的編譯器上使用它(例如iPhone編譯器)。真正讓我感到震驚的是,這些課程還不存在...... – Goz 2011-02-01 12:10:35
有趣的是,GCC> 4.4和VS2010似乎都支持它。這是輝煌的。在涵蓋windows,linux和Android移動平臺的主要平臺上。鏗也表示,「很多」的例子工作... – Goz 2011-02-01 12:15:39