Найти длину std :: wstring

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

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

1

Решение

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

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

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

3

Другие решения

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

2

По вопросам рекламы [email protected]