Что вы подразумеваете под "персонажами"?
std::basic_string
- это просто контейнер для ряда значений, который мы считаем строкой. Неважно, в чем кодировка значений; все, что он делает, это хранит и управляет упорядоченной последовательностью значений. Поэтому функции size
и length
определяют, сколько значений он хранит.
Если ваш std::wstring
содержит строку, которая представляет, скажем, действительную строку в кодировке UTF-16, std::wstring
не имеет значения. Unicode-кодировки - это просто способы кодирования кодовых точек. UTF-16 использует 16-битные кодовые единицы для кодирования своих кодовых точек, которые могут включать суррогатные пары 16-битных значений, которые соответствуют одной кодовой точке Unicode.
Однако код Unicode не является «символом» в некоторых определениях этого термина. Например, существуют комбинированные кодовые точки, где несколько кодовых точек объединяются для формирования графемы. Есть невидимые кодовые точки (контрольные коды и т. П.).
Если вы хотите знать, сколько кодовых точек в std::wstring
, вам придется пройтись по этой строке с помощью функции, которая может обрабатывать данные UTF-16. Если вы хотите узнать, сколько графем (логических глифов) содержится в строке, вам нужно будет пройтись по нему с гораздо более сложным алгоритмом.