C++ UTF-8 производится с ICU

Я изо всех сил пытаюсь начать с библиотекой ICU C++. Я попытался заставить самый простой пример работать, но даже который перестал работать. Я был бы точно так же, как, чтобы произвести строку 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, сделают это так или иначе.

Любая справка ценилась бы, спасибо.

12
задан Isaac 29 April 2010 в 17:51
поделиться

3 ответа

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

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

Вы использовали макрос только для строк, содержащих «инвариантные символы», то есть только латинские буквы, цифры и некоторые знаки препинания .

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

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

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

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

srl, icu dev

13
ответ дан 2 December 2019 в 19:53
поделиться

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

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

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

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

3
ответ дан 2 December 2019 в 19:53
поделиться

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

1
ответ дан 2 December 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: