Я собираюсь использовать библиотеку ICU для транслитерации, но я хотел бы предоставить специальный файл транслитерации для набора конкретных пользовательских транслитераций, который будет включен в ядро ICU во время компиляции для использования в двоичной форме в другом месте. Я работаю с источником ICU 4.2 по причинам совместимости.
Насколько я понимаю, со страницы данных ICU на их веб-сайте один из способов сделать это - создать файл trnslocal.mk в ICUHOME / source / data / translit / и в этом файл имеет одну строку 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{
"",
""
}
}
Затем я сохраняю в каталоге custom
файл 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()
и Transliterator::getAvailableID(i)
не перечисляет мою пользовательскую транслитерацию. Я не забываю читать в отношении пользовательских конвертеров, что они должны быть зарегистрированы в /source/data/mappings/convrtrs.txt. Есть ли аналогичный файл для транслитераторов?
Кажется, что мой пользовательский транслитератор либо не встроен в соответствующие пакеты (хотя ошибок компиляции нет), либо неправильно отформатирован, либо каким-то образом не зарегистрирован для использования. Кстати, мне известен маршрут RuleBasedTransliterator во время выполнения, но я бы предпочел иметь возможность компилировать пользовательские транслитерации для использования в любом произведенном двоичном файле.
Дайте мне знать, если понадобятся какие-либо дополнительные разъяснения. Я знаю, что здесь есть по крайней мере один программист ICU, который очень помог в других постах, которые я написал и видел в других местах. Я был бы признателен за любую помощь, которую я могу найти. Заранее спасибо!