Я изо всех сил пытаюсь начать с библиотекой 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, сделают это так или иначе.
Любая справка ценилась бы, спасибо.
Ваша программа будет работать, если вы просто измените инициализатор на:
UnicodeString s("привет");
Вы использовали макрос только для строк, содержащих «инвариантные символы», то есть только латинские буквы, цифры и некоторые знаки препинания .
Как было сказано ранее, кодовые страницы ввода / вывода сложны. Вы сказали:
Мой терминал и шрифт поддерживают UTF-8 и я регулярно использую терминал с UTF-8. Мой исходный код находится в UTF-8.
Это может быть правдой, но ICU не знает, что это правда. Кодовая страница процесса может быть другой (скажем, iso-8859-1), а кодовая страница вывода может быть другой (скажем, shift-jis). Тогда программа перестала бы работать. Но неизменные символы, использующие API UNICODE_STRING_SIMPLE, по-прежнему будут работать.
Надеюсь, это поможет.
srl, icu dev
Что произойдет, если вы запишете вывод в файл (либо с перенаправлением с помощью каналов из терминала, либо путем открытия файлового потока в самой программе)
Это определило бы, действительно ли терминал не может правильно обработать вывод.
Что произойдет, если вы проверите строку вывода в отладчике? Содержит ли он правильные значения? Выясните, как должна выглядеть кодировка UTF-8 вашей строки , и сравните ее с тем, что вы получаете в отладчике. Или распечатайте целое значение каждого байта и убедитесь, что оно верное.
При работе с кодировкой всегда сложно (но важно) определить, заключается ли проблема в самой программе или в преобразовании, которое происходит, когда текст выводится в систему. Выньте терминал из уравнения и убедитесь, что ваша программа генерирует правильный результат.
operator << (ostream, UnicodeString)
преобразует UTF16 в символы с помощью «конвертера по умолчанию» ICU. AFAIU, «конвертер по умолчанию» (если вы не устанавливаете его явно с помощью ucnv_setDefaultName ()
), зависит от платформы и способа компиляции ICU. Что вы получите от ucnv_getDefaultName ()
?