UTF-8-совместимые IOstreams - PullRequest
       11

UTF-8-совместимые IOstreams

2 голосов
/ 25 октября 2011

Поддерживает ли стандартная библиотека GCC, Boost или любая другая библиотека совместимые с iostream версии ifstream или ofstream, которые поддерживают преобразование между потоками в кодировке UTF-8 (file-) и std::vector<wchar_t> или std::wstring?

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Решение C ++ 11 состоит в том, чтобы обернуть поток UTF-8 в соответствующий wbuffer_convert

#include <fstream>
#include <string>
#include <codecvt>
int main()
{
    std::ifstream utf8file("test.txt"); // if the file holds UTF-8 data
    std::wbuffer_convert<std::codecvt_utf8<wchar_t>> conv(utf8file.rdbuf());
    std::wistream ucsbuf(&conv);
    std::wstring line;
    getline(ucsbuf, line); // then line holds UCS2 or UCS4, depending on the OS
}

Это работает с Visual Studio 2010 и clang ++ / libc ++, но, к сожалению, не с GCC.

Пока это не станет широко распространенным, сторонние библиотеки действительно являются лучшим решением.

2 голосов
/ 25 октября 2011

Ваш вопрос не совсем работает.UTF-8 - это особая кодировка, а wchar_t - это тип данных.Более того, стандарт wchar_t предназначен для представления набора символов системы , но это полностью оставлено платформе, и стандарт не предъявляет никаких требований.

Следовательно, правильная вещьСначала запрашивается преобразование между узкой многобайтовой кодировкой системы и кодированием фиксированной длины кодировки системы в широкую строку.Эта функциональность обеспечивается std::mbstowcs и std::wcstombs.Также может быть где-то локаль, которая оборачивает это, но это немного нишевая область библиотеки.

Если вы хотите конвертировать между непрозрачной «кодировкой системы», предписанной стандартом, и определенной кодировкойпредписанный вашим сериализованным источником / приемником данных, вам нужна дополнительная библиотека.Я бы порекомендовал Posix iconv(), который широко доступен.(Windows API имеет другой подход и предлагает специальные функции для преобразования.)

C ++ 11 немного облегчает проблему, добавляя явное семейство строковых типов и литералов в кодировке UTF, и, вероятно, также предоставляет средства перекодировки средите (хотя я никогда не видел их реализованными кем-либо).

Вот мой стандартный ответ прошлых постов на эту тему: Q1 , Q2 , Q3 .C ++ 11 будет радостью, когда он будет полностью доступен: -)

...