2010-04-29 3 views
12

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

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

#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, будут все равно.

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

+1

Вы пытались использовать std :: wcout? – Milan

+1

Да, но ICU, похоже, не предоставляет оператора << для него, поэтому я просто получаю длинный список ошибок из g ++. – Isaac

+0

Вы отправили ошибку на wcout? (пожалуйста? :) (с обоснованием?) –

ответ

12

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

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

макросоци- вы использовали, является only for strings that contain "invariant characters", i.e., only latin letters, digits, and some punctuation.

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

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

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

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

SRL, СИС DEV

+0

Спасибо! Это действительно работает. Поскольку вы подписались на «icu dev», возможно, вы узнаете: знаете ли вы о каких-либо каналах IRC для помощи в ICU? Я искал, но я не мог найти. – Isaac

+0

Я не знаю ни одного канала IRC - мы такие популярные? Я иногда смотрю здесь (и иногда делаю другие поисковые запросы в Интернете), но основные каналы для загрузки icu-support и базы данных ошибок на http://icu-project.org являются основными каналами. Это интересная идея. Вы можете предложить его там. Я технический руководитель для ICU для C/C++. –

+0

В последние несколько дней я искал решение Unicode, и ICU считается «лучшим» для C++ из всех источников, которые я прочитал. Все те же источники также жалуются, что документация сильно отсутствует, и есть много других сообщений на форуме, говорящих то же самое. Учитывая, что я не мог даже получить программу «hello world» для работы, я бы согласился с этим, извините. Я знаю, что это не ваша вина, но если у вас есть какое-либо влияние, пожалуйста, сделайте несколько советов по улучшению документов. – Isaac

2

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

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

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

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

+0

Запись в файл - очень хороший шаг в отладке кодировок. –

+0

Я только что написал файл, и я получаю тот же результат. Сейчас я посмотрю в отладчике. – Isaac

1

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

+1

FWIW автономный инструмент «icuinfo» сообщает по умолчанию кодовую страницу по 4.4. Конвертер по умолчанию может поступать из многих диких и прекрасных мест. –

+0

Моя проблема теперь решена, но чтобы ответить на ваш вопрос, я получаю «en_GB». – Isaac

+1

icuinfo должен вернуть что-то вроде: По умолчанию locale: en_US ... Преобразователь по умолчанию: UTF-8 –

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