Я могу заставить 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ú».
Задача ещё не решена.
Других решений пока нет …