unicode - ICU自定义音译

标签 unicode transform icu transliteration

我希望利用 ICU 库进行音译,但我想为一组特定的自定义音译提供自定义音译文件,以便在编译时合并到 ICU 核心中,以便在其他地方以二进制形式使用。出于兼容性原因,我正在使用 ICU 4.2 的源代码。

据我了解,来自the ICU Data page of their website ,解决此问题的一种方法是在 ICUHOME/source/data/translit/中创建文件 trnslocal.mk,并在该文件中包含单行 TRANSLIT_SOURCE_LOCAL=custom.txt

对于 custom.txt 文件本身,我基于主文件 root.txt 使用了以下格式:

custom{
    RuleBasedTransliteratorIDs {
            Kanji-Romaji {
            file {
              resource:process(transliterator){"custom/Kanji_Romaji.txt"}
              direction{"FORWARD"}
            }
         }
    }
    TransliteratorNamePattern {
        // Format for the display name of a Transliterator.
        // This is the language-neutral form of this resource.
        "{0,choice,0#|1#{1}|2#{1}-{2}}" // Display name
    }
    // Transliterator display names
    // This is the English form of this resource.
    "%Translit%Hex"         { "%Translit%Hex" }
    "%Translit%UnicodeName" { "%Translit%UnicodeName" }
    "%Translit%UnicodeChar" { "%Translit%UnicodeChar" }
    TransliterateLATIN{        
        "",
        ""
    }
}

然后,我将文件 Kanji_Romaji.txt 存储在目录 custom 中,如 here 所示。 。因为它使用 > 而不是我在其他文件中看到的 ,所以我适本地转换了每个条目,所以它们现在看起来像:

丁 → Tei ;
七 → Shichi ;

当我编译 ICU 项目时,没有出现任何错误。

但是,当我尝试在测试文件中使用此自定义音译器(与内置音译器配合良好的测试文件)时,我遇到了错误错误:65569:U_INVALID_ID

我使用以下代码来构造音译器并输出错误:

UErrorCode status = U_ZERO_ERROR;
Transliterator *K_R = Transliterator::createInstance("Kanji-Romaji", UTRANS_FORWARD, status);
if (U_FAILURE(status))
{
std::cout << "error: " << status << ":" << u_errorName(status) << std::endl;
return 0;
}

此外,循环到 Transliterator::countAvailableIDs()Transliterator::getAvailableID(i) 不会列出我的自定义音译。我记得读过有关自定义转换器的内容,它们必须在/source/data/mappings/convrtrs.txt 中注册。有类似的音译器文件吗?

看来我的自定义音译器要么没有构建到适当的包中(尽管没有编译错误),要么格式不正确,要么以某种方式没有注册使用。顺便说一句,我知道运行时的 RuleBasedTransliterator 路由,但我希望能够编译自定义音译以在任何生成的二进制文件中使用。

如果需要任何额外说明,请告诉我。我知道这里至少有一位 ICU 程序员,他在我在其他地方写过和看到的其他帖子中也提供了很大的帮助。我将不胜感激任何我能找到的帮助。预先感谢您!

最佳答案

音译器源自 CLDR - 您可以将音译器添加到 CLDR(crosswire 目录在 cldr/目录中包含 XML 格式的音译器)并重建 ICU 数据。 ICU 没有像您尝试的那样添加音译器的简单机制。我要做的就是忘记 trnslocal.mk 或 custom.txt,因为您不需要添加任何文件,只需修改 root.txt - 如果您有建议的改进,您可能会提交错误。

关于unicode - ICU自定义音译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6270357/

相关文章:

用于删除口音的 php iconv translit : not working as excepted?

java - 检查字母是否大写的更快方法(性能)?

jquery - 获取元素-moz-transform :rotate value in jQuery

iphone - 在iPhone上使用CoreMotion/DeviceMotion模拟图像 float 效果

c++ - 在 ICU4C 中获取 UChar 的十六进制值

python - 用于将 <U9999> 格式的 unicode 字符转换为其 ASCII 等效项的脚本

c# - Linux Debian 多语言上的 Mono C# 应用程序

python - 使用转换计算数据框中的特定值和聚合结果

c++ - toUTF8String 和本地引用

c++ - ICU 添加自定义字符集检测