我試圖在Windows中實現文本支持,以便稍後也轉移到Linux平臺。以統一的方式支持國際語言是理想的,但在考慮這兩個平臺時似乎並不容易完成。我花了相當多的時間閱讀UNICODE,UTF-8(以及其他編碼),widechars等等,這裏是我到目前爲止瞭解的內容:UNICODE,UTF-8和Windows混亂
UNICODE作爲標準描述了集合可映射的字符以及它們出現的順序。我將其稱爲「what」:UNICODE指定什麼將可用。
UTF-8(和其他編碼)指定如何:每個字符將如何以二進制格式表示。
現在,在windows上,他們選擇了最初的UCS-2編碼,但是未能滿足要求,所以UTF-16就是他們所擁有的,在必要時也是多字符。
因此,這裏的delemma:
- 的Windows內部只做UTF-16,所以如果你想支持你不得不轉換爲其widechar版本,以便使用OS據此呼籲國際字符。似乎沒有任何支持使用多字節UTF-8字符串來調用諸如CreateFileA()之類的東西,並使它看起來正確。它是否正確?
- 在C語言中,有一些支持多字節的函數(_mbscat,_mbscpy等),但是在windows上,字符類型被定義爲unsigned char *。鑑於_mbs系列函數不是一個完整的集合(例如,沒有_mbstol將多字節字符串轉換爲long),您不得不使用某些char *版本的運行時函數,由於這些函數之間的有符號/無符號類型差異而導致編譯器問題。有人甚至使用這些?你只是做了一堆鑄造來解決錯誤?
- 在C++中,std :: string有迭代器,但這些都是基於char_type,而不是代碼點。所以如果我在一個std :: string :: iterator上做一個++,我得到下一個char_type,而不是下一個代碼點。同樣,如果你調用std :: string :: operator [],你會得到一個char_type的引用,這個引用很有可能不是一個完整的代碼點。那麼如何通過代碼來迭代std :: string? (C具有_mbsinc()函數)。
不是「必要時需要多字節」。這只是「多字節」。在開始處理它之前,您不知道它是否「必要」。 –
這是關於這個主題的[我的帖子](http://stackoverflow.com/questions/6300804/wchars-encodings-standards-and-portability)也許這是你感興趣的。對於(3),將數據轉換爲UTF-32(理想情況下存儲在char32_t中),然後代碼指向相同的字符串元素。 –
請記住,代碼點迭代Unicode字符串的合法理由很少,因爲字形可能由多個代碼點表示(每個代碼點可以是UTF-8或UTF-16中的多個代碼單元,但對於許多實際目的都是兩次相同的問題)。規範化是一個合法的原因,編碼爲UTF-8是另一個合理的原因,但這些都是您可以使用庫的事情。 –