2014-09-19 61 views
4

我正在學習Unicode,並有幾個問題希望得到解答。std :: wstring是否支持Windows上的UTF-16和UTF-32?

1)我讀過在Linux上,std :: wstring是4字節,而在Windows上,它是2字節。這是否意味着Linux內部支持是UTF-32而Windows是UTF-16

2)是否使用std :: wstring與std :: string接口非常相似?

3)VC++是否支持使用4字節的std :: wstring?

4)如果你使用std :: wstring,你是否必須改變編譯器選項?

作爲一個旁註,我遇到了一個字符串庫,用於處理UTF-8,它有一個非常類似於std :: string的接口,它提供了諸如length,substr,find,大小寫轉換等熟悉的功能。圖書館是Glib :: ustring

請隨時添加任何意見或其他建議,因爲我真的需要它。

謝謝!

+0

C++ 11 char32_t類型應該提供一個解決方案,但是它在Microsoft待辦事項列表中是最後一個。相當令人懷疑它會在未來10年有任何用處:)是的,你幾乎總是需要一個圖書館來做任何不平凡的事情。 ICU是一種常見的選擇。 – 2014-09-19 16:44:45

+0

@HansPassant,這引起了我很多VC++混淆與未聲明的標識符等。 ICU是如此之大......我想我會嘗試使用Glib :: ustring來查看它是否滿足我的所有需求。順便說一句,你後來提醒我關於代碼頁,你是如此的正確。 – 2014-09-19 17:31:02

+0

幾乎所有關於它的東西都寫在utf8everywhere.org宣言中。 – 2014-09-20 20:33:36

回答

3

1)wstringbasic_string<wchar_t>wchar_t大小是依賴於實現和編碼不可知(標準只是說,「其值可表示爲所支持的語言中規定的最大擴展字符集的所有成員不同碼」。但是,是,具有sizeof(wchar_t)=4字節的實現支持UTF-32,和sizeof(wchar_t)=2字節支持UTF-16。

2)wstringbasic_string<wchar_t>,而stringbasic_string<char>,所以是,它是一個非常類似的接口。您將不得不使用wcout,wcinwfstream,並且還有其他一些約束。

3)不,MSVC將wchar_t定義爲unsigned short,如您所說,它定義和限制wstring。 MSVC提供了將wchar_t作爲typedef而不是內部類型的可能性。你可以想象然後重新定義typedef,但我懷疑這是一種冒險和邪惡。

4)不,這取決於你選擇你想要的字符串類型。

5)UTF-32和標準:有趣的是,在非常編碼不可知C++標準,UTF-32是顯式地僅針對codecvt mentionned:「專業化的codecvt <char32_t, char, mbstate_t>的UTF-32和UTF-8編碼之間轉換表達式。codecvt在本地字符集之間轉換爲窄字符和寬字符。「這表明char32_t將是UTF-32的可移植方法。不幸的是MSVC不支持這種類型。

+0

在Christophe和@RemyLebeau,謝謝你的出色答案。 – 2014-09-19 17:26:28

+0

「MSVC將wchar_t定義爲unsigned short」缺省情況下,wchar_t是內置類型。您鏈接的頁面解釋了這一點。 – 2014-09-19 17:50:50

+0

@DDmmmm,是的,我的措辭是誤導性的。當然,使用編譯器的默認選項,MSVC將wchar_t作爲本機類型處理。我的意思是MSVC推動 - 無論什麼選項 - 賦予這種類型與無符號短一樣的特徵/限制。 – Christophe 2014-09-19 18:29:56

4

1)我讀過Linux上的std :: wstring是4字節,而在Windows上是2字節。這是否意味着Linux內部支持是UTF-32而Windows是UTF-16?

它實際上是wchar_t而不是std::wstring,即Linux上4個字節和Windows上2個字節。 std::wstringstd::basic_string<wchar_t>的typedef,因此std::wstring支持Linux上的UTF-32和Windows上的UTF-16,是的。

2)是否使用std :: wstring與std :: string接口非常相似?

std::wstring都和std::stringstd: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::u16stringstd::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::stringGlib::ustring只需要進一步使用gunicharguint32的typedef)而不是char,並將其接口公開爲使用原始Unicode代碼點而不是編碼代碼單元進行操作。