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

Я могу заставить 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% уверен, что оно будет правильным.

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

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

Мой вопрос о транслитерации.
Я хочу например Китайские иероглифы, такие как 牛, нужно транслитерировать на «Niú».

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]