题
在我的网络应用程序中,我正在使用 二 不同的语言 英语 和 阿拉伯.
我有一个 搜索框 在我的Web应用程序中,如果我们按名称或名称的一部分搜索,那么它将通过比较DB从DB检索值 “家乡” 用户
解释:
就像用户属于 家乡“加利福尼亚” 他搜寻了 姓名 说 “胜利者” 然后我的查询将首先看到有 同一个家乡“加利福尼亚” 在拥有的人名单中 “加利福尼亚” 作为家乡 “胜利者” *姓名*将被搜索, 取回 用户拥有 “加利福尼亚” 作为他们 家乡 和 ”胜利者“以他们的名字或名称的一部分。
这 问题 是家乡 “加利福尼亚” 是 保存 在 英语 它将比较和检索值。但 “加利福尼亚” 将会 在阿拉伯语中保存为“كال盔”. 。在这种情况下 家乡比较失败 而且它无法检索值。
我希望我的查询应该发现两者都是同一家乡并检索价值观。是否可以?
什么 备用 我应该考虑这种逻辑进行比较。我很困惑。有什么建议吗?
编辑: *我有一个想法,如果 家乡 然后是可以使用Google Translator或音译器并将家乡更改为另一种语言。如果是英语,则可以使用阿拉伯语或用英语使用,然后对阿拉伯语进行搜索结果。有建议吗?*
解决方案
将所有名称音译成相同的语言(例如英语)进行搜索,并使用Levenstein编辑距离来计算名称的语音表示之间的相似性。如果您简单地将查询与每个名称进行比较,但是如果将数据库中的所有位置预先索引 Burkhard-keller树, ,然后可以通过与查询项的编辑距离进行有效搜索。
此技术使您可以通过它们的实际匹配程度对名称进行排序。您可能比使用Swenaphone或Double-Metaphone更有可能找到这种方式,尽管这更难实现。
其他提示
您遇到的问题是,您希望 /需要两种或更多语言的信息,并且您希望应用程序的用户能够使用两种语言。一种可能的方法是每项保留多个记录,并将语言代码作为主要密钥的一部分,例如,如果您的记录为
id hometown name
001 California Victor
您可以介绍语言代码并存储
id lang hometown name
001 en California Victor
001 ar كاليفورنيا Victor
然后,您的搜索将匹配“加利福尼亚”或“ككا届”,从语言数量,并具有不需要预填充表的额外优势。您可以在已知记录时添加新的翻译以供记录添加。
(警告:我只是重复了您的阿拉伯语字符串,我看不懂,也很可能不是Aribic的正确语言代码,但您明白了。)
阿拉伯语吗? 声音 喜欢“加利福尼亚”?如果是这样,您需要在“声音般”基础上进行比较,这很可能会导致音素转换。
您的Google建议听起来可能也是一个很好的建议,但是您应该处理它,并确保您对它的准确性感到满意。在测试希伯来语和英语之间的工作方式时,我注意到有时Google翻译成希伯来语时,Google只是在英语字母中留下英语地名。
如何使用客户端的某些本地化来显示值。或为 家乡 那将覆盖 equal(Object)
以加利福尼亚的实例将返回 true
对于“ California”和“ the”和“ككال学”(对不起,如果我在这里犯了错误,只需从上方复制)即可。
这听起来像是一个经典的编码问题。每当您传输非ASCII字符时,都需要确保正确编码它。对于阿拉伯语和英语,我怀疑您可以使用 UTF-8 (但是我不知道阿拉伯语,所以这可能是错误的)。
在您的设置中,您可能会有以下几点:
Browser <-> Servlet container <-> Database
|
System.out
在将字符(16位)转换为字节(8位)的任何系统界面中,您都需要确保编码正确。
浏览器到servlet容器
当您从网页中获取或发布请求时,浏览器将查看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-Driver。
示例JDBC连接字符串
jdbc:mysql://localhost:3306/rimario?useUnicode=true&characterEncoding=utf-8
系统
System.out.printnln()
不能依靠验证事物。首先,它取决于Java VM默认编码,使用System.Property设置 -Dfile.encoding=UTF-8
, ,其次,您要执行系统的终端,需要设置并支持UTF-8。不要相信系统。
一旦VM中的字符串是正确的字符,它将不会受编码的影响。在存储器中,字符串中的每个字符都是16位,几乎(几乎)涵盖了UTF-8可以编码的所有字符。您可以将字符串写入文件,然后调查文件 知道 如果您在VM中有正确的炭。