我可以让 ICU 使用“Any-Latin”将其音译为拉丁语,但这仍然包括不在 Latin1 代码页中的字符,例如宏。我可以使用“Any-Latin;Latin-ASCII”将其音译为 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++。
需要明确的是,这与Is there a way to convert from UTF8 to iso-8859-1? 这个问题只是在已知内容仅为 iso-8859-1 时在编码之间进行转换。转换一对一地映射字符,并且对于目标编码不支持的任何字符都失败。
我的问题是关于音译。我希望例如像牛这样的汉字被音译为“Niú”。