Это ошибка, если версия std::wstring
использует 17 символов: она должна использовать только 11 символов.Используя последние SVN-главы gcc и clang, он использует 11 символов для std::wstring
и 17 символов для std::string
.Я думаю, что это то, что ожидалось.
Обратите внимание, что стандартная библиотека C ++ внутренне имеет другое представление о том, что такое «символ», чем то, что можно ожидать при кодировании из нескольких слов (например, UTF-8 для словвведите char
и UTF-16 для слов с 16 битами).Вот первый абзац главы, описывающей строку (21.1 [strings.general]):
В этом разделе описываются компоненты для манипулирования последовательностями любого типа, не являющегося массивом POD (3.9).В этом разделе такие типы называются символоподобными типами, а объекты типоподобных типов называются символоподобными объектами или просто символами.
Это в основном означает, что при использовании Unicode различные функции не будет обращать внимание на то, что составляет кодовую точку, а скорее обрабатывать строки как последовательность слов.Это серьезные последствия и то, что произойдет, например, при создании подстрок, поскольку они могут легко разделить многобайтовые символы.В настоящее время стандартная библиотека C ++ не поддерживает внутреннюю обработку многобайтовых кодировок, поскольку предполагается, что преобразование из кодировки в символы выполняется при чтении данных (и, соответственно, при записи данных происходит иначе).Если вы обрабатываете многобайтовые кодированные строки внутренне, вы должны знать об этом, поскольку вообще никакой поддержки нет.
Признано, что такое положение вещей на самом деле является проблемой.В C ++ 2011 был добавлен символьный тип char32_t
, который должен поддерживать символ Unicode по-прежнему лучше, чем wchar_t
(потому что Unicode использует 20 бит, в то время как wchar_t
было разрешено поддерживать только 16 бит, что выбирается на некоторых платформах ввремя, когда Unicode обещал использовать максимум 16 бит).Однако это все равно не касается совмещения персонажей.Комитет C ++ признает, что это проблема, и что правильная обработка символов в стандартной библиотеке C ++ была бы полезной, но пока никто не выступит с комплексным предложением по решению этой проблемы (если вы считаете, что хотитепредложить что-то вроде этого, но вы не знаете, как, пожалуйста, не стесняйтесь связаться со мной, и я помогу вам, как подать предложение).