2008-10-07 2 views
4

У меня есть строка std :: с символами UTF-8.
Я хочу преобразовать строку в ее ближайший эквивалент с символами ASCII.UTF-8 в ASCII с использованием библиотеки ICU

Например:

Лодзи => Лодзь
Assunção => Assuncao
Шлосс => Schloss

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

Может ли кто-нибудь дать небольшой пример о том, как это можно сделать ???
спасибо.

ответ

3

Я не знаю о ICU, но ICONV делает это и его довольно легко изучить. это всего около 3-4 вызовов, и в вашем случае вам нужно использовать флаг ICONV_SET_TRANSLITERATE, используя iconvctl().

+0

Функция iconvctl, кажется, не быть частью стандартных реализаций Iconv. По крайней мере, система Linux, над которой я работаю, ее не имеет. – GetFree

+0

iconv не является стандартом. это библиотека. если у вас нет iconvctl, ваш сломан: http://www.gnu.org/software/libiconv/ – shoosh

+0

Посмотрите в конце этой страницы: http://www.gnu.org/software/libiconv/documentation /libiconv/iconvctl.3.html (раздел «СООТВЕТСТВИЕ») – GetFree

0

Это не та область, в которой я эксперт, но если у вас нет библиотеки, удобной для вас, то вам может быть проще создать таблицу/карту поиска, содержащую UTF -8 -> ASCII. то есть. Ключом является символ UTF-8, значение представляет собой последовательность символов ASCII.

+0

К сожалению, транслитерация немного сложнее. – GetFree

0

Разложение ß-> ss говорит мне, что вы хотите разложить совместимость. В ICU для этого вам нужен класс Normalizer. Впоследствии у вас будет что-то вроде L'odz '. Из этой строки вы можете просто удалить символы, отличные от ASCII. Нет необходимости в ICU, обычный STL.

3

Попробуйте это, ucnv_convert ("US-ASCII", "UTF-8", targer, targetsize, источник, sourcesize, PError)

1

Я написал функцию обратного вызова, которая разлагает, а затем делает некоторые замены. Вероятно, это может быть реализовано как транслитерация. код находится здесь decompcb.c и заголовок находится рядом. Установите его следующим образом на преобразователь Unicode-на-ASCII:

ucnv_setFromUCallBack(gConverter, &UCNV_FROM_U_CALLBACK_DECOMPOSE, &status); 

затем использовать gConverter конвертировать из юникода в ASCII

+0

Транслитератор Latin-ASCII перешел в ICU 4.6/CLDR 1.9. –

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