Как получить ICU для транслитерации с любого Unicode на Latin1 (ISO-8859-1) в C++

Я могу заставить ICU транслитерировать на латынь, используя "Any-Latin", но это все еще включает символы, например макроны, которых нет в кодовой странице Latin1. Я могу заставить его транслитерировать в ASCII, используя "Any-Latin; Latin-ASCII", но затем я теряю все акцентированные символы, которые являются действительными символами Latin1. Мне нужно что-то промежуточное, что конкретно делает "Any-ISO_8859_1"

Единственный способ сделать это - создать набор пользовательских правил. Например, преобразовать в латиницу, а затем удалить макроны и все, что не является латиницей1:

UnicodeString Latin1_Rules(
    "::Any-Latin; "
    "::nfd; ::[\\u0304] remove; ::nfc;"
    // etc...
    );
// Create a custom Transliterator
icu::Transliterator* trans = icu::Transliterator::createFromRules("Latin1",
    Latin1_Rules,
    UTRANS_FORWARD,
    ...

Но я не уверен, какие еще вещи мне нужно будет удалить, и это решение кажется очень неуклюжим и, вероятно, очень медленным, и я не уверен, что когда-либо буду на 100% уверен, что оно будет правильным.

Я не женат на СИС, если есть лучший (более простой / быстрый) способ. Но я застрял с C/C++.

Чтобы было ясно, это не тот же вопрос, что и есть ли способ конвертировать из UTF8 в ISO-8859-1? Этот вопрос как раз о преобразовании между кодировками, когда уже известно, что контент является только iso-8859-1. Преобразование сопоставляет символы один-к-одному и завершается неудачно для любых символов, не поддерживаемых целевой кодировкой.

Мой вопрос о транслитерации. Например, я хочу, чтобы китайские иероглифы, такие как 牛, транслитерировались в "Niú".

0 ответов

Другие вопросы по тегам