如何将unicode符号映射到Java中更简单的拉丁语脚本

时间:2014-09-28 07:23:05

标签: java unicode normalize

我希望尽可能将图形/符号字符映射到更简单的Java替代方案,例如:

  • U1E36拉丁大写字母l,带点下方 - > L
  • U25B6黑色右指向三角形 - > >
  • U25C0黑色左指向三角形 - > <
  • U25B2 Black UP-Pointing Triangle - > ^

我的问题是我不知道所有的角色是什么如此,虽然技术上很容易映射上面的特定字符很难为每个人做,但可能有数百个。

我已经有删除重音符号

的代码
public static final Pattern DIACRITICS_AND_FRIENDS
        = Pattern.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+");


private static String stripDiacritics(String str) {
    str = Normalizer.normalize(str, Normalizer.Form.NFD);
    str = DIACRITICS_AND_FRIENDS.matcher(str).replaceAll("");
    return str;
}

所以我想知道是否有类似的东西帮助我使用这些符号字符,请注意我不想删除它们只是用更简单的表示替换。

2 个答案:

答案 0 :(得分:1)

你想要做的事情不能以通用的方式完成,因为unicode标准并不总是指定每个角色的“更简单”形式,在许多情况下,尝试它甚至没有意义。

如果查看LATIN SMALL LETTER U WITH DIAERESIS之类的页面,您将看到标准实际为给定角色指定的信息。 (仅查看​​标有 Unicode数据的块。)

请注意,分配给另一个unicode序列的分解,但是该字符可以 表示为\u00fc\u0075\u0308 。您可以机械地将第一个实例转换为第二个实例,然后剥离所有组合标记,但是......

现在看一下像CYRILLIC SMALL LETTER DZE这样的东西,你会看到虽然使用或多或少与S完全相同的东西打印,但它实际上是一个完全不同的字母。事实上它所发出的声音是 / dz /

如果确实 真的想要这样做,你就必须用一个包含每个字符映射的数据库编写一个库。有些像上面的第一个例子,你可以半自动地做,但是像第二个例子的其他例子没有真正清晰的映射。

答案 1 :(得分:1)

我发现这个Lucene过滤器尝试通过查看unicode值大于\ u0080的每个char并尝试通过大量case语句映射到更简单的字符来尝试做我想要做的事情

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.lucene/lucene-core/2.9.1/org/apache/lucene/analysis/ASCIIFoldingFilter.java

通过下载源代码并查看

可以找到

和更改版本

org.apache.lucene.analysis.miscellaneous

因此,已经进行了合理的尝试,但很难确定它涵盖的还有Normalizer方法未涵盖的其他字符。