java - 应该使用哪个罗马化标准来改进阿拉伯语-拉丁语的 ICU4j 音译?
问题描述
我们需要将阿拉伯文本音译为拉丁字符(不带变音符号)并将其显示给用户。
我们目前正在为此使用 IBM ICU4j。API 不能很好地将阿拉伯文本转译成适当的可读拉丁字符。请参考以下示例:
例子
阿拉伯文字:
صدام حسين التكريتي
谷歌的音译输出
:
Sadaam Hussein al-tikriti
ICU4J 的音译输出
:
ṣdạm ḥsyn ạltkryty
我们如何改进 ICU4j 库的音译输出?
ICU4J 为我们提供了编写自己的规则的选项,但我们目前陷入困境,因为我们团队中没有人懂阿拉伯语并且无法找到任何可以遵循的适当标准。
解决方案
我花了 4 个小时来研究任何其他资源来解决这个问题。后来我尝试了 ICU4J 并找到了解决您问题的方法。您可以运行代码并查看您遗漏的点。
package com.webom.crypt;
import org.apache.commons.lang3.StringEscapeUtils;
import com.ibm.icu.text.Transliterator;
public class Test {
public static String ARABIC_TO_LATIN = "Arabic-Latin";
public static String ARABIC_TO_LATIN_NO_ACCENTS = "Arabic-Latin; nfd; [:nonspacing mark:] remove; nfc";
public static void main(String[] args) {
String ARABICString = "صدام حسين التكريتي";
String unicodeCodes = StringEscapeUtils.escapeJava(ARABICString);
System.out.println("Unicode codes:" + unicodeCodes);
///YOUR WAY
Transliterator ARABICToLatinTrans = Transliterator.getInstance(ARABIC_TO_LATIN);
String result1 = ARABICToLatinTrans.transliterate(ARABICString);
System.out.println("ARABIC to Latin:" + result1);
//MINE WAY
Transliterator ARABICToLatinNoAccentsTrans = Transliterator.getInstance(ARABIC_TO_LATIN_NO_ACCENTS);
String result2 = ARABICToLatinNoAccentsTrans.transliterate(ARABICString);
System.out.println("ARABIC to Latin (no accents):" + result2);
}
}
只需检查答案并自行验证。因为您收到的输出将完全如下所示。
Unicode codes:\u0635\u062F\u0627\u0645 \u062D\u0633\u064A\u0646\u0627\u0644\u062A\u0643\u0631\u064A\u062A\u064A
ARABIC to Latin:ṣdạm ḥsyn ạltkryty
ARABIC to Latin (no accents):sdam hsyn altkryty
推荐阅读
- javascript - 与单个复选框交互后,无法在取消选中/选中标题复选框时取消选中/选中复选框 - Vuejs
- curl - Telegram Bot,发送文件的占位符?
- ubuntu - CURL - 没有输出到终端 - Ubuntu 14.04
- android - Android Studio 未显示设计预览但应用程序正在运行
- javascript - 如何在 javascript 函数中使用“get_template_directory_uri”
- windows - 错误代码 8007203c 是什么意思?在 Windows 活动目录中?
- javascript - 如何在 vue 中的各个组件之间共享数据
- python - Python,用逗号分割字符串,引号内除外,忽略空格
- c# - 如何访问 Linq 中“付费”类中的 PayTime 字段
- html - 如何使一个按钮居中而不考虑另一个在 div 内内联显示的标签