Смайлик - это не два символа, в один символ, заданный суррогатной парой: двумя словами в кодировке UTF-16. При этом первое слово пары всегда имеет значение в диапазоне 0xD800 - 0xDBFF, а второе слово - в диапазоне 0xDC00 - 0xDFFF.
Просто пройдись по строке и посчитай все значения wchar_t, которые НЕ попадают в диапазон 0xDC00 - 0xDFFF (второе слово суррогатной пары).
Вы можете использовать функцию wcslen(), чтобы получить длину wstring, включая любые многобайтовые символы или эмодзи. Вот пример того, как его использовать: #include #include int main() { std::wstring s = L"Привет, мир! ?"; std::wcout