2013-02-21 63 views
1

如何確定std::wstring中的長度(字符數)?查找std :: wstring的長度

使用myStr.length()給出字節大小(我認爲),但它不是字符數。我是否需要創建自己的函數來查找字符數或是否有本地C++方式或本機WinAPI方式

+3

http://en.cppreference.com/w/cpp/string/basic_string/size:返回字符串中的字符數 – billz 2013-02-21 02:50:02

+0

看到這個問題:http://stackoverflow.com/questions/4183736/stdwstring-長度爲 – 2013-02-21 02:50:49

+2

「*使用'myStr.length()'給出字節大小(我認爲),但它不是字符數。*」你爲什麼這麼認爲? – ildjarn 2013-02-21 02:51:52

回答

3

std::wstring::length()會給你的字符數,其中字符定義爲wstring對象的原子單元,即wchar。這就是標準在涉及characters時的含義(關於標準中單詞使用的更多細節,請參見this post)。

但是,對於Unicode字符而言,一個wchar是否對應於一個Unicode字符取決於wstring中使用的編碼。如果使用UTF-16(通常(但不一定)),則一個wchar將對應於僅用於基本多語言平面的一個Unicode字符(即,所有字符集都源自ISO-8859以及大多數常用CJK字符,但不是一些更奇特的(如古典漢字)字符)(*)。如果您想在這種情況下獲得全部 Unicode字符的字符數,則需要使用支持Unicode的庫(例如ICU),或者自行編碼。

(*)還有其他問題,如果系統的使用,@一二三組合字符正確地指出。正確計算這些數據最好使用適當的庫來完成。

+5

「*如果使用的是UTF-16,通常是*」如果是「常用」,則表示「在Windows上」。 – 2013-02-21 03:01:37

+0

@NicolBolas我會將其更改爲_often_ :) – jogojapan 2013-02-21 03:04:19

+1

即使在UTF-16的BMP中,組合表單和表單形式可能會使一個「字符」顯示爲兩個「wchar」(反之亦然)。 – 2013-02-21 07:06:48

2

如果您想知道wchar_t實體的長度,請使用myStr.length()。如果你想知道Unicode codepoints的大小,你必須找到一個知道如何計算這些大小的庫。您也可以自己編寫一個 - 確定編碼爲UTF-16的代碼點是否使用一個或兩個實體的規則並不難,請參閱http://en.wikipedia.org/wiki/Utf-16。要知道您的wchar_t是16位(與32位),請使用sizeof(wchar_t) == 2