1)我讀過Linux上的std :: wstring是4字節,而在Windows上是2字節。這是否意味着Linux內部支持是UTF-32而Windows是UTF-16?
它實際上是wchar_t
而不是std::wstring
,即Linux上4個字節和Windows上2個字節。 std::wstring
是std::basic_string<wchar_t>
的typedef,因此std::wstring
支持Linux上的UTF-32和Windows上的UTF-16,是的。
2)是否使用std :: wstring與std :: string接口非常相似?
std::wstring
都和std::string
是std:basic_string
的typedef,所以它們具有相同的接口,只是不同value_type
類型(wchar_t
VS char
,分別地)。
3)VC++是否支持使用4字節的std :: wstring?
不適用於std::wstring
本身,沒有。但是你可以創建自己的std::basic_string
的typedef,例如:
typedef std::basic_string<int32_t> u32string;
事實上,這正是如何在新的C++ 11 std::u16string
和std::u32string
類型定義:
typedef std::basic_string<char16_t> u16string;
typedef std::basic_string<char32_t> u32string;
它也不是聞所未聞以使std::basic_string
一個typedef爲TCHAR
:
typedef std::basic_string<TCHAR> tstring;
作爲一個旁註,我遇到了一個UTF-8字符串庫,它與std :: string提供了非常類似的接口,它提供了諸如length,substr,find,大小寫轉換等熟悉的功能。庫是油嘴:: ustring。
從技術上講,你可以(和許多人)使用UTF-8的標準std::string
。 Glib::ustring
只需要進一步使用gunichar
(guint32
的typedef)而不是char
,並將其接口公開爲使用原始Unicode代碼點而不是編碼代碼單元進行操作。
C++ 11 char32_t類型應該提供一個解決方案,但是它在Microsoft待辦事項列表中是最後一個。相當令人懷疑它會在未來10年有任何用處:)是的,你幾乎總是需要一個圖書館來做任何不平凡的事情。 ICU是一種常見的選擇。 – 2014-09-19 16:44:45
@HansPassant,這引起了我很多VC++混淆與未聲明的標識符等。 ICU是如此之大......我想我會嘗試使用Glib :: ustring來查看它是否滿足我的所有需求。順便說一句,你後來提醒我關於代碼頁,你是如此的正確。 – 2014-09-19 17:31:02
幾乎所有關於它的東西都寫在utf8everywhere.org宣言中。 – 2014-09-20 20:33:36