如何比较JAVA中的不同语言字符串值?

在我的网络应用程序中,我使用两种不同的语言,即英语和阿拉伯语。 我的Web应用程序中有一个搜索框,如果我们按名称或部分名称搜索,那么它将通过比较用户的“Hometown”从DB中检索值 说明: 就像一个用户属于家乡“加利福尼亚”并且他搜索一个名字叫“Victor”然后我的查询将首先看到拥有相同家乡“加利福尼亚”的人和在“加利福尼亚”作为故乡的人的名单中将搜索“Victor”* name *,并检索将“California”作为其家乡的用户以及名称或部分名称中的“victor”。 问题是如果家乡“加利福尼亚”用英语保存,它将比较并检索值。但“加利福尼亚”将用阿拉伯语保存为“كاليفورنيا”。在这种情况下,家乡比较失败,它无法检索值。 我希望我的查询应该找到两个相同的家乡并检索值。可能吗? 对于这种比较逻辑,我应该考虑什么样的替代方案。我很迷惑。有什么建议吗? 编辑: *我有一个想法,如果有家乡,那么可以使用谷歌翻译或音译,并将家乡改为另一种语言。如果是英语,那么阿拉伯语或者如果是英语,那么阿拉伯语,并给搜索结果加入两者。有什么建议吗?*     
已邀请:
将所有名称音译为相同的语言(例如英语)进行搜索,并使用Levenstein编辑距离来计算名称的语音表示之间的相似性。如果您只是将查询与每个名称进行比较,这将会很慢,但如果您将数据库中的所有地名预先索引到Burkhard-Keller树中,则可以通过编辑距离查询项的距离来有效地搜索它们。 此技术允许您根据实际匹配的距离对名称进行排序。你可能比使用metaphone或双音乐手机更有可能找到匹配,尽管这更难以实现。     
您遇到的问题是您希望/需要2种或更多语言的信息,并且您希望应用程序的用户能够使用这两种语言。一种可能的方法是为每个项目保留多个记录,并将语言代码作为主键的一部分,例如,如果您的记录是
id   hometown   name
001  California Victor
你可以介绍语言代码和商店
id   lang hometown   name
001  en   California Victor
001  ar   كاليفورنيا Victor
然后你的搜索将匹配“加利福尼亚”或“كاليفورنيا”给你id 001,然后你可以使用它来加载你的数据的所有翻译(或只是当前输出语言的数据。)这个sceme可以用于任何语言数量,并且具有额外的优势,您无需预填表。您可以在记录成为已知时添加新的翻译。 (警告:我只是重复了你的阿拉伯语字符串,我无法阅读它,也'ar'很可能不是正确的语言代码,但你明白了。)     
阿拉伯语听起来像“加州”吗?如果是这样,你需要比较一个“声音”的基础,这很可能会导致音素转换。     
你的谷歌建议听起来似乎也不错,但你应该玩它,并确保你对它的准确性感到满意。在测试它如何在希伯来语和英语之间发挥作用时,我注意到有时谷歌在翻译成希伯来语时只留下英文字母的英文字母。     
如何在客户端使用一些本地化来显示值。或者为家乡创建一个包装类,它将以加利福尼亚州的实例和“كاليفورنيا”返回
true
的方式覆盖
equal(Object)
(对不起,如果我在这里犯了错误,只是从上面复制粘贴)。     
这听起来像是一个经典的编码问题。每当你转移非ascii字符时,你需要确保你正确编码。对于阿拉伯语和英语我怀疑你可以使用UTF-8(但我不懂阿拉伯语,所以它可能是错的)。 在您的设置中,您可能会有以下几点:
Browser <-> Servlet container <-> Database
                   |
                System.out
在将字符(16位)转换为字节(8位)的任何系统接口中,您需要确保编码正确。 浏览器到Servlet容器 当您从网页执行GET或POST请求时,浏览器将查看1)来自服务器的HTTP标头,尤其是
Content-Type: text/html; charset=UTF-8
,如果存在,将覆盖HTML元标题
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
。 在servlet容器端,HttpServletRequest.getParameter()将具有您最有可能需要在服务器设置中设置的编码。 示例tomcat的server.xml
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
           maxThreads="2000"                
           connectionTimeout="20000" 
           redirectPort="8443" />
Servlet容器到数据库 数据库需要具有正确的编码,否则排序等不正确。 示例my.cnf for MySQL
[mysqld] 
 ....
init_connect=''SET collation_connection = utf8_general_ci'' 
init_connect='SET NAMES utf8' 
default-character-set=utf8 
character-set-server = utf8 
collation-server = utf8_general_ci 

[mysql] 
 ....
default-character-set=utf8 
然后需要为UTF-8设置JDBC驱动程序。 示例JDBC连接字符串
jdbc:mysql://localhost:3306/rimario?useUnicode=true&characterEncoding=utf-8
System.out的 不能依靠
System.out.printnln()
来验证事物。首先它取决于使用System.property
-Dfile.encoding=UTF-8
设置的java vm默认编码,其次是你在其中执行System.out的终端,需要设置为并支持UTF-8。不要信任System.out! 一旦VM中的String是正确的字符,它就不会受到编码的影响。在内存中,字符串中的每个字符串都是16位,它(几乎)覆盖了utf-8可以编码的所有字符。您可以将字符串写入文件并调查该文件,以确切知道您的VM中是否有正确的字符。     

要回复问题请先登录注册