Поддержка Unicode в C ++ 0x - PullRequest
       14

Поддержка Unicode в C ++ 0x

16 голосов
/ 16 января 2011

Я пытаюсь использовать новые символы Юникода в C ++ 0x.Поэтому я написал пример кода:

#include <fstream>
#include <string>
int main()
{
    std::u32string str = U"Hello World";

    std::basic_ofstream<char32_t> fout("output.txt");

    fout<<str;  
    return 0;
}

Но после выполнения этой программы я получаю пустой файл output.txt.Так почему же он не печатает Hello World?

Также есть что-то вроде cout и cin, уже определенное для этих типов, или stdin и stdout не поддерживают Unicode?

Редактировать: я использую g ++ и Linux.

РЕДАКТИРОВАТЬ: ВНИМАНИЕ.Я обнаружил, что стандартный комитет отклонил потоки Unicode из C ++ 0x.Поэтому ранее принятый ответ больше не верен.Для получения дополнительной информации см. мой ответ !

Ответы [ 3 ]

6 голосов
/ 16 января 2011

Поддержка строковых литералов Unicode начала в GCC 4.5.Возможно, в этом проблема.

[править]

После некоторого поиска я обнаружил, что потоки для этих новых литералов Unicode описаны в N2035 и он был включен в черновик стандарта.Согласно этому документу вам нужно u32ofstream для вывода вашей строки, но этот класс отсутствует в библиотеке GCC 4.5 C ++ 0x.

В качестве обходного пути вы можете использовать обычный fstream:

std::ofstream fout2("output2.txt", std::ios::out | std::ios::binary);
fout2.write((const char *)str.c_str(), str.size() * 4);

Таким образом, я вывел вашу строку в UTF-32LE на моей машине Intel (которая имеет младший порядок).

[править]

Я был немногонемного ошибочен в отношении статуса u32ofstream: согласно последнему проекту на веб-сайте Комитета по стандартам C ++ вы должны использовать std::basic_ofstream<char32_t>, как и раньше.Этот класс будет использовать класс codecvt<char32_t,char,typename traits::state_type> (см. Конец § 27.9.1.1), который должен быть реализован в стандартной библиотеке (поиск codecvt<char32_t в документе), но он недоступен в GCC 4.5.

3 голосов
/ 14 апреля 2011

В новом стандарте C ++ не будет потоков Unicode.

Как упомянул @ssmir, стандартный комитет собирался добавить поддержку потоков Unicode в C ++ 0x.Однако в функциональных выпусках комитет решил убрать потоковую поддержку Unicode.Для получения дополнительной информации см. ссылка .

Это похоже на единственный способ вывести строку Unicode - преобразовать ее в строку ASCII с помощью codecvt .

1 голос
/ 16 января 2011

При создании поток пытается получить 'codecvt' из глобальной локали, но не может получить его, потому что единственные стандартные codecvt предназначены для char и wchar_t. В результате элемент _M_codecvt объекта потока имеет значение NULL. Позже, при попытке вывода ваш код выдает исключение (невидимое для пользователя) в функции проверки фасета в basic_ios.h, потому что фасет инициализируется из _M_codecvt.

Добавьте фасет к локальному элементу, связанному с потоком, чтобы выполнить преобразование из char32_t в правильный вывод. Наполните поток локалью, содержащей codecvt правильного типа.

...