我希望尽可能将图形/符号字符映射到更简单的Java替代方案,例如:
我的问题是我不知道所有的角色是什么如此,虽然技术上很容易映射上面的特定字符很难为每个人做,但可能有数百个。
我已经有删除重音符号
的代码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;
}
所以我想知道是否有类似的东西帮助我使用这些符号字符,请注意我不想删除它们只是用更简单的表示替换。
答案 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语句映射到更简单的字符来尝试做我想要做的事情
通过下载源代码并查看可以找到和更改版本
org.apache.lucene.analysis.miscellaneous
包
因此,已经进行了合理的尝试,但很难确定它涵盖的还有Normalizer方法未涵盖的其他字符。