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

如何将unicode符号映射到Java中更简单的拉丁语脚本,java,unicode,normalize,Java,Unicode,Normalize,我希望尽可能将图形/符号字符映射到更简单的Java替代方案,例如: U1E36拉丁文大写字母l随下面的点->l U25B6黑色直角三角形->> U25C0黑色左指三角形->^ 我的问题是我不知道所有的字符都是什么,所以虽然从技术上讲,映射上面的特定字符很容易,但很难对每个字符都进行映射,可能会有数百个 我已经有了删除口音的代码 public static final Pattern DIACRITICS_AND_FRIENDS = Pattern.compile("[\\p{

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

  • U1E36拉丁文大写字母l随下面的点->l
  • U25B6黑色直角三角形->>
  • U25C0黑色左指三角形->
  • ^
我的问题是我不知道所有的字符都是什么,所以虽然从技术上讲,映射上面的特定字符很容易,但很难对每个字符都进行映射,可能会有数百个

我已经有了删除口音的代码

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;
}

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

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

如果您像这样查看页面,您将看到标准实际为给定字符指定了哪些信息。(仅查看标记为Unicode数据的块。)

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

现在看看类似的东西,你会发现,虽然它是用类似
S
的东西打印的,但实际上它是一个完全不同的字母。事实上,它发出的声音是/dz/


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

我发现了这个Lucene过滤器,它试图通过查看每个unicode值大于\u0080的字符,并通过大量case语句查看它是否映射到一个更简单的字符来完成我试图完成的任务

通过下载源代码并查看,可以找到alter version

org.apache.lucene.analysis.miscellaneous
包装


因此,已经进行了合理的尝试,但很难计算出规范化器方法未涵盖的其他字符

谢谢,但问题是关于符号和图形字符,而不是变音符号之类的,这部分已经很好地解决了。关键是提供可在文件名中使用的值的表示形式,以便更便于移植。通常,无法发音或理解原始语言的用户将使用此功能,并且使用与此无关的图形字符anyway@PaulTaylor:但基础系统是相同的。没有您要求的那种“通用”转换,因此必须自己创建一个转换表。卡斯基在最后一段中正确地指出了这一点。我很惊讶,要么我是第一个想要这个,要么我不是第一个,但没有人愿意分享他们的定制转换。欢迎来到I18N的世界。:-)另外,请特别注意西里尔语的例子,那里的字形相似性与下面的辅音没有关系。可悲的是,字形是字形,字符是字符,unicode只编码字符。字体对字形进行编码。根据其他地方的注释,“重点是提供可在文件名中使用的值的表示形式,以便更便于移植”——请查看。谢谢,但这不是我最近的链接: