我希望利用 ICU 库进行音译,但我想为一组特定的自定义音译提供自定义音译文件,以便在编译时合并到 ICU 核心中,以便在其他地方以二进制形式使用。出于兼容性原因,我正在使用 ICU 4.2 的源代码。
据我了解,从他们网站的 ICU 数据页面 http://userguide.icu-project.org/icudata,解决此问题的一种方法是在 ICUHOME/source/data/translit/ 中创建文件 trnslocal.mk ,并在该文件中包含一行TRANSLIT_SOURCE_LOCAL=custom.txt
.
For the 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{
"",
""
}
}
然后我存储在目录中custom
文件Kanji_Romaji.txt
, 发现here http://crosswire.org/svn/icu-sword/trunk/source/data/translit/crosswire/Kanji_Romaji.txt。因为它使用>
而不是→
我在其他文件中看到,我适当地转换了每个条目,所以它们现在看起来像:
丁 → Tei ;
七 → Shichi ;
当我编译 ICU 项目时,没有出现任何错误。
然而,当我尝试在测试文件中使用此自定义音译器(与内置音译器配合良好的测试文件)时,我遇到了错误error: 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()
and Transliterator::getAvailableID(i)
没有列出我的自定义音译。我记得读过有关自定义转换器的内容,它们必须在 /source/data/mappings/convrtrs.txt 中注册。有类似的音译器文件吗?
看来我的自定义音译器要么没有构建到适当的包中(尽管没有编译错误),要么格式不正确,要么以某种方式没有注册使用。顺便说一句,我知道运行时的 RuleBasedTransliterator 路由,但我希望能够编译自定义音译以在任何生成的二进制文件中使用。
如果需要任何额外说明,请告诉我。我知道这里至少有一位 ICU 程序员,他在我在其他地方写过和看到的其他帖子中也提供了很大的帮助。我将不胜感激任何我能找到的帮助。先感谢您!