2012-06-10 85 views
3

使用std :: string和UTF8似乎是一個相當複雜的問題,我找不到do和do的很好解釋。使用UTF8

如何正確使用C++中的UTF8?這相當混亂。

我發現boost::locale和我設置全局區域設置:

std::locale::global(boost::locale::generator()(""));

然而,在此之後我需要什麼考慮,我什麼時候能拿到的問題?從文件寫入/讀取如預期的那樣工作,字符串比較等...?

到目前爲止,我知道下面的:

  • std::regex/boost::regex將無法​​正常工作,在需要covnert寬字符串和使用wregex。
  • boost::algorithm::to_upper將無法​​正常工作,需要使用boost::locale::to_upper
比什麼,我需要知道的

其他?

+0

沒錯。在應用程序內部,不能使用UTF-8。 C++標準庫建立在假設一個編碼值=一個字符的基礎上。 –

+0

那我該怎麼處理? wstring/UTF16不是一個編碼值=一個字符嗎? – ronag

+0

@ Cheersandhth.-Alf:這個假設在UCS-4中也是不真實的。實際上,它在任何* Unicode編碼中都是不真實的。 – Fanael

回答

2

歡迎來到宏偉的Unicode世界。

  1. 對不起,wchar_t是實現定義,通常在Windows將不足以容納一個完整的代碼點爲亞洲腳本(例如)
  2. 您可以使用查詢比較,但排序數據並將它們呈現給觀衆,您將需要full collation algorithm。例如,知道德語字典中的命令與德語電話簿中的命令不同(並且會哭...)
  3. 一般來說,我建議不要自己變換字符串。 Boost.Locale算法在包裝ICU時應該一般工作,但應避免使用臨時操作。
  4. 如果您將字符串拆分爲多個部分,請不要在字詞中間拆分。將字符分成兩部分(即使使用代碼點感知算法,由於變音符號),或者甚至避免這種情況,在兩個字符之間進行分割(因爲一些文化將某些相鄰字符組合爲一個字符)很容易。
+0

「通常在Windows上」不足以保存「亞洲腳本的完整代碼點」錯誤,CJK腳本位於BMP中。 – Fanael

+3

@Fanael:大部分都是,但一些擴展名在[Supplementary Ideographic Plane](http://en.wikipedia.org/wiki/Supplementary_Ideographic_Plane#Supplementary_Ideographic_Plane) –

+0

實際上,MS-Windows下的當前Unicode支持使用UTF-16它支持必需的全部20位以支持所有Unicode字符(D800和DFFF之間的代碼),包括補充表意平面。老版本的MS-Windows(如果我是正確的Win2k及以上版本)使用UCS-2。 –