2013-02-21 4 views
1

Как определить длину (количество символов) в std::wstring?Найти длину std :: wstring

Использование myStr.length() дает размер байта (я думаю), но это не количество символов. Нужно ли мне создавать свою собственную функцию, чтобы найти количество символов или есть ли собственный способ C++ или собственный способ WinAPI?

+3

http://en.cppreference.com/w/cpp/string/basic_string/size: возвращает количество символов в строке – billz

+0

См. Этот вопрос: http://stackoverflow.com/questions/4183736/stdwstring- length –

+2

"* Использование' myStr.length() 'дает размер байта (я думаю), но это не количество символов. *« Почему вы так думаете? – ildjarn

ответ

3

std::wstring::length() даст вам количество символов, где характера определяются как атомарная единицы wstring объекта, т.е. wchar. Это означает, что Стандарт означает, что он относится к characters (см. this post для получения более подробной информации об использовании слова в стандарте).

Однако, если речь идет о символах Юникода, то один символ wchar соответствует одному символу Юникода, зависит от кодировки, используемой внутри wstring. Если используется UTF-16, который часто (но не обязательно) случай, один wchar будет соответствовать одному символу Юникода только для базовой многоязычной плоскости (т.е. все наборы символов, полученные из ISO-8859, а также большинство широко используемых CJK, но не некоторые из более экзотических (например, классических китайских) персонажей) (*). Если вы хотите, чтобы число символов было правильно для , все символы Unicode в этом случае вам нужно использовать библиотеку, совместимую с Unicode (например, ICU), или запрограммировать ее самостоятельно.

(*) Есть дополнительные проблемы, если объединяющие символы используются как @ 一 二三 указывает правильно. Считать их правильно также лучше всего, используя соответствующие библиотеки.

+5

"* Если используется UTF-16, который обычно *« Если «обычно», вы имеете в виду «в Windows». –

+0

@NicolBolas Я изменю его на _often_ :) – jogojapan

+1

Даже в BMP для UTF-16 объединение форм и форм презентации может сделать один «символ» представленным как два 'wchar's (и наоборот). –

2

Если вы хотите знать длину в объектах wchar_t, используйте myStr.length(). Если вы хотите узнать размер в кодовых точках Unicode, вам нужно будет найти библиотеку, которая знает, как их подсчитать. Вы также можете написать их самостоятельно - правила определения того, является ли кодовая точка кодированной, поскольку UTF-16 использует один или два объекта, не слишком сложны, см. http://en.wikipedia.org/wiki/Utf-16. Чтобы узнать, имеет ли ваш wchar_t 16 бит (против 32 бит), используйте sizeof(wchar_t) == 2.

Смежные вопросы