Как читать / хранить Unicode со строками и потоками STL - PullRequest
9 голосов
/ 24 декабря 2008

Мне нужно изменить мою программу так, чтобы она принимала Unicode, которая может исходить из любой кодировки UTF-8 и различных кодировок UTF-16 и UTF-32. Я не очень разбираюсь в Unicode (хотя я читал статью Джоэла Спольски и страницу Википедии ).

Прямо сейчас я использую std::istream и читаю свой ввод char на char, а затем сохраняю (при необходимости) в std::string. Я бы хотел

  • измените это (с минимальными усилиями) для поддержки вышеуказанных кодировок, и
  • выясните, как протестировать вышеуказанные кодировки (я вроде американка, и не знаю, как даже создать образец текстового файла в другой кодировке), и в идеале
  • сделать это кроссплатформенным способом.

Также, если возможно, я бы хотел максимально сэкономить место (поэтому, если нам не требуется больше, чем байт / символ, мы его не используем). Из того, что я понимаю, это означает сохранение в UTF-8, что нормально, но я не знаю стандартной строки, которая делает это (из того, что я понимаю, wchar_t имеет определенный размер реализации и кодировку).

Ответы [ 2 ]

2 голосов
/ 24 декабря 2008

UTF-8 экономит место, если вы в основном используете стандартные символы ASCII.

std :: string не имеет проблем с UTF-8, так как в нем нет 0 байтов. Вы можете указать std :: string, как долго вводятся символы ввода, если они имеют нулевые байты, как в UTF-32. std :: string не сможет определить количество символов в вашей строке UTF-8, вам придется использовать внешнюю функцию.

Кроме того, существует широкая версия std :: string с использованием wchar_t, в отличие от char, я просто забываю имя.

Также в бусте есть аспекты для преобразования между кодировками.

Вы можете использовать стандартную библиотеку с boost. Или вы можете использовать функции обработки строк из библиотеки C. Есть также функции, предоставляемые средами программирования, такими как Qt и Tcl.

См. Например:

utf8 фасет codecvt

...