C ++ UTF-8 вывод с ICU - PullRequest
       39

C ++ UTF-8 вывод с ICU

12 голосов
/ 29 апреля 2010

Я изо всех сил пытаюсь начать работу с библиотекой C ++ ICU. Я пытался получить самый простой пример для работы, но даже это не удалось. Я просто хотел бы вывести строку UTF-8, а затем перейти оттуда.

Вот что у меня есть:

#include <unicode/unistr.h>
#include <unicode/ustream.h>

#include <iostream>

int main()
{
    UnicodeString s = UNICODE_STRING_SIMPLE("привет");

    std::cout << s << std::endl;

    return 0;
}

Вот вывод:

$ g++ -I/sw/include -licucore -Wall -Werror -o icu_test main.cpp 
$ ./icu_test 
пÑивеÑ

Мой терминал и шрифт поддерживают UTF-8, и я регулярно использую терминал с UTF-8. Мой исходный код в UTF-8.

Я думаю, что, возможно, мне как-то нужно установить выходной поток в UTF-8, потому что ICU хранит строки как UTF-16, но я действительно не уверен, и я бы подумал, что операторы, предоставленные ustream.h, будут это в любом случае.

Любая помощь будет оценена, спасибо.

Ответы [ 3 ]

13 голосов
/ 29 апреля 2010

Ваша программа будет работать, если вы просто измените инициализатор на:

UnicodeString s("привет");

Макрос, который вы использовали, только для строк, которые содержат «инвариантные символы», т. Е. Только латинскийбуквы, цифры и некоторые знаки препинания .

Как было сказано ранее, кодовые страницы ввода / вывода сложны.Вы сказали:

Мой терминал и шрифт поддерживают UTF-8, и я регулярно использую терминал с UTF-8.Мой исходный код находится в UTF-8.

Это может быть правдой, но ICU не знает, что это правда.Кодовая страница процесса может быть другой (скажем, iso-8859-1), а выходная кодовая страница может быть другой (скажем, shift-jis).Тогда программа не будет работать.Но инвариантные символы, использующие API UNICODE_STRING_SIMPLE, все равно будут работать.

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

srl, icu dev

3 голосов
/ 29 апреля 2010

Что произойдет, если вы запишите выходной файл в файл (либо перенаправив с помощью каналов из терминала, либо открыв поток файлов в самой программе)

Это определит, является ли терминал терминалом,не может правильно обработать вывод.

Что произойдет, если вы проверите выходную строку в отладчике?Содержит ли он правильные значения?Узнайте, как должна выглядеть кодировка UTF-8 вашей строки , и сравните ее с тем, что вы получаете в отладчике.Или распечатайте интегральное значение каждого байта и убедитесь, что они верны.

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

1 голос
/ 29 апреля 2010

operator<<(ostream, UnicodeString) преобразует между UTF16 и символами, используя ICU «конвертер по умолчанию». AFAIU, «конвертер по умолчанию» (если вы не установите его явно с помощью ucnv_setDefaultName()) зависит от платформы и способа компиляции ICU. Что вы получаете от ucnv_getDefaultName()?

...