Java 如何准备用于索引的Unicode字符串?

Java 如何准备用于索引的Unicode字符串?,java,text,indexing,unicode,unicode-normalization,Java,Text,Indexing,Unicode,Unicode Normalization,这个问题涉及到在索引中存储本地名称的国际字符的规范化。我想对这个问题进行一般性的讨论,并听听Java中可能存在的解决方案(类/库) 在全局应用程序中,用户输入自己的姓名,应用程序将每个姓名写入搜索索引,以便其他用户可以搜索姓名并找到用户。在英语中是微不足道的,但在许多其他语言和/或全球范围内并非如此微不足道,因为特定字母需要音译和/或可以以多种形式书写。例如,德国名字Häußler可以写成 哈乌勒(德国) 海斯勒(德国,国际音译) 哈苏斯勒(瑞士) 豪斯勒(英文音译) Java具有

这个问题涉及到在索引中存储本地名称的国际字符的规范化。我想对这个问题进行一般性的讨论,并听听Java中可能存在的解决方案(类/库)


在全局应用程序中,用户输入自己的姓名,应用程序将每个姓名写入搜索索引,以便其他用户可以搜索姓名并找到用户。在英语中是微不足道的,但在许多其他语言和/或全球范围内并非如此微不足道,因为特定字母需要音译和/或可以以多种形式书写。例如,德国名字Häußler可以写成

  • 哈乌勒(德国)
  • 海斯勒(德国,国际音译)
  • 哈苏斯勒(瑞士)
  • 豪斯勒(英文音译)
Java具有

    Normalizer.normalize(entry, Normalizer.Form.NFD) // NFC
类,但这在许多情况下似乎不起作用,并且/或者我不知道如何正确地使用它。这里也有很好的阅读,但是我找不到足够的关于这个主题的捆绑信息

有人知道有人已经在某个开源项目中解决了这个问题吗?有可以使用的库吗?网站


你如何将日语、汉语、阿拉伯语等译成英语?像Facebook这样的大型社交网络如何翻译他们的用户名,以确保在国际上找到他们?

你的思路是正确的——你可能想添加一个搜索词“canonical”


我相信是处理这一问题的最健壮的开源软件。请特别关注,尤其是NFKCßU Casefold的实现,它处理的是德国ß的例子以及其他许多例子。

非常有趣的问题。。。我记得我研究了另一个SO问题的规范化内容,目标是去除重音(我在使用
规范化器分解后使用正则表达式做到了这一点)。然而,在国际上,我想,即使是Unicode也不能满足这个要求。。。不知道这是否存在,但可能有一个库将文本“翻译”成?标题中的“Unicode字符串”是一种冗余;Java从一开始就使用Unicode,尽管
char
实际上是一个UTF-16代码单元(这就是为什么BMP之外的代码点需要两个
char
s——原因是Java诞生时,Unicode只定义了现在称为BMP的东西)谢谢,ICU是一个非常有趣的提示,我会调查这件事,然后回来。