在我的网络应用程序中,我正在使用 不同的语言 英语阿拉伯.

我有一个 搜索框 在我的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中有正确的炭。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top