Юникод std :: string замена класса - PullRequest
10 голосов
/ 17 мая 2011

Я ищу предложения относительно замены std :: string библиотеки, поддерживающей юникод.У меня есть куча кода, который использует std :: string, его итераторы и т. Д., И хотел бы теперь поддерживать строки Unicode (предпочтительны реализации с открытым исходным кодом или с открытым исходным кодом, возможности регулярного выражения были бы хорошими!)

В данный момент я не уверен, что мне потребуется полная перезапись или я смогу отказаться от добавления новой библиотеки строк, которая поддерживает все интерфейсы std :: string.Мир юникода кажется очень сложным, и я просто хочу включить его в своих приложениях, чтобы не нужно было изучать каждый его аспект.

Кстати, как работает оператор индекса, когда ему приходится возвращать ссылку наструктура 1, 2,3 или 4, которая теоретически может измениться на структуру 1,2,3 или 4 байта.если передается значение большего или меньшего размера, происходит ли смещение назад и вперед внутреннего представления данных?

Ответы [ 5 ]

10 голосов
/ 17 мая 2011

Вам не нужно полностью переписывать, если вы уверены, что содержит ваша строка std ::. Например, вы можете предположить (и преобразовать входные данные, чтобы быть уверенными), что ваша std :: string содержит строки в кодировке UTF8 (для тех, которые нуждаются в локализации). Не забывайте, что std :: string является только контейнером необработанных данных, он не связан с кодировкой (даже в C ++ 0x, это всего лишь возможность, а не требование).

Затем, когда вы передаете текст в другие библиотеки, которым требуется другое кодирование, вы можете использовать библиотеки, такие как UTF8CPP, для преобразования в требуемую кодировку (но в большинстве случаев такие библиотеки будут делать это сами).

Этот способ делает это простым. UTF8 со стандартным std :: string в вашем коде, что позволяет передавать строку юникода во все остальное (с преобразованием при необходимости).

В списках рассылки сообщества поддержки было много дискуссий. Возможно, чтение (если у вас достаточно времени ...) поможет вам понять другие возможные решения.

7 голосов
/ 17 мая 2011

В зависимости от ваших потребностей, используйте std :: wstring или более крупный и более сложный (но фактический стандарт) ICU: http://site.icu -project.org /

6 голосов
/ 17 мая 2011

какая кодировка Юникода вам нужна? Если с utf-8 все в порядке, вы можете посмотреть Glib :: ustring

Glib :: У ustring есть то же самое интерфейс как std :: string, но содержит Юникод символы в кодировке UTF-8.

1 голос
/ 17 мая 2011

Запрос "типа, подобного std :: string, но для Unicode" - это все равно, что запросить "тип, такой как unsigned, но для простых чисел". std :: string вполне может хранить Unicode во многих кодировках - наиболее распространенным является UTF-8.

То, что вам нужно заменить, это ваши итераторы , а не тип хранения . Итераторы должны перебирать кодовые точки строки, а не байты. То есть ++i должен выдвигать одну кодовую точку, а *i должен возвращать кодовую точку (через uint32_t), а не char.

0 голосов
/ 21 ноября 2015

Я написал свою собственную C ++ UTF-8 библиотеку , которая является заменой std::wstring / string.Тип данных, который отображается пользователю - char32_t, но внутри широкие символы упакованы в utf8 char.

Все это довольно быстро, и его производительность лучше всего с небольшим количеством Юникодакодовые точки во многих кодовых точках ascii.Все операции, известные из std :: string, доступны с этим классом (кроме подстроки find) и , работают с индексами кодовой точки , в отличие от байтовых индексов.

В качестве бонусазащитного программирования, весь диапазон ANSI 0-255 может использоваться без многобайтовых данных:)

Надеюсь, это поможет!

...