2011-01-16 4 views
16

Я пытаюсь использовать новые символы Unicode в C++ 0x. Так что я написал пример кода:Поддержка Unicode в 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.

EDIT: ИНТЕЛЛЕКТ. Я обнаружил, что стандартный комитет отклонил потоки Unicode из C++ 0x. Таким образом, ранее принятый ответ больше не подходит. Для получения дополнительной информации см. my answer!

+0

Является ли файл пустым, потому что он имеет 0 байтов, или он пуст, потому что ваш текстовый редактор не показывает никаких печатных символов? – Gabe

+1

@Gabe it hase 0 байт – UmmaGumma

+0

какая версия gcc вы используете? – ssmir

ответ

6

Unicode string литерал поддержки began в GCC 4.5. Может, в этом и проблема.

[править]

После некоторого копания я обнаружил, что потоки для этого нового Юникода литералов описаны в N2035, и это было в проекте стандарта included. В соответствии с этим документом вам понадобится u32ofstream для вывода строки, но этот класс отсутствует в GCC 4.5 C++ 0x library.

В качестве временного решения можно использовать обычный 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: в соответствии с latest draft на web site Комитет по стандартам ++ С в вы должны использовать std::basic_ofstream<char32_t>, как вы делали. Этот класс будет использовать класс codecvt<char32_t,char,typename traits::state_type> (см. Конец §27.9.1.1), который должен быть реализован в стандартной библиотеке (поиск codecvt<char32_t в документе), но он недоступен в GCC 4.5.

+0

Я запускаю gcc 4.5.2 и получаю тот же результат, что и OP :( –

+0

По словам Григория Джавадяна, это не проблема. :( – UmmaGumma

+0

Я пробовал с моим gcc 4.5 и отредактировал свой ответ – ssmir

1

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

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

+0

C++ code from мой ответ содержит пример того, как читать/записывать потоки 'wchar_t' в' 'utf-8'' способом, описанным в вашем ответе. http://stackoverflow.com/questions/2522152/python-is-a-dictionary-slow -to-find-frequency-of-each-character/2525617 # 2525617 – jfs

3

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

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

Это швы, как единственный способ вывода строки Unicode, состоит в том, чтобы преобразовать его в строку ASCII с codecvt.

+0

Huh? Где ssmir подразумевает это? Ваша ссылка на 4-летнюю статью. – Potatoswatter

+1

Стандарт содержит потоки Unicode по крайней мере в th последний проект. См. Мой отредактированный ответ. – ssmir

+0

точно, что ответ? как? Мне нужно использовать что-то вроде cout, но у меня есть u32string, который мне нужно выводить. http://en.wikipedia.org/wiki/C%2B%2B11 показывает мне, как сделать строки unicode, и я заглянул в заголовки строк gcc, чтобы найти u32string. –

Смежные вопросы