1

在我的网络应用程序中,我使用了两种不同的语言,即英语阿拉伯语

我的网络应用程序中有一个搜索框,如果我们按名称或部分名称搜索,那么它将通过比较用户的“家乡”从数据库中检索值

解释:

就像如果用户属于家乡“加利福尼亚”并且他搜索一个名字“维克多”,那么我的查询将首先看到具有相同家乡“加利福尼亚”的人,并且在以“加利福尼亚”作为家乡的人列表中“Victor” * name * 将被搜索并检索“California”家乡且名称或部分名称为“ victor ”的用户。

问题是如果家乡“加利福尼亚”英文保存,它将比较并检索这些值。但是“加利福尼亚”在阿拉伯语中保存为“كاليفورنيا”。在这种情况下,家乡比较失败并且无法检索值。

我希望我的查询应该发现两者都是同一个家乡并检索值。可能吗?

对于这种比较逻辑,我应该考虑什么替代方案。我很困惑。请问有什么建议吗?

编辑: *我有一个想法,如果获得了家乡,那么是否可以使用谷歌翻译器或音译器并将家乡更改为另一种语言。如果是英文,则为阿拉伯文,或者如果是英文,则为阿拉伯文,并将搜索结果加入两者。有什么建议吗?*

4

6 回答 6

6

您遇到的问题是您想要/需要 2 种或更多语言的信息,并且您希望应用程序的用户能够使用这两种语言。一种可能的方法是为每个项目保留多条记录,并包括一个语言代码作为主键的一部分,例如,如果您的记录是

id   hometown   name
001  California Victor

您可以引入语言代码并存储

id   lang hometown   name
001  en   California Victor
001  ar   كاليفورنيا Victor

那么您的搜索将匹配“California”或“كاليفورنيا”,为您提供 id 001,然后您可以使用它来加载数据的所有翻译(或仅加载当前输出语言的数据。)此 sceme 可用于任何语言的数量,并具有额外的优势,您不需要预先填写表格。当记录已知时,您可以为记录添加新的翻译。

(警告:我只是重复了你的阿拉伯语字符串,我看不懂,'ar' 很可能不是 aribic 的正确语言代码,但你明白了。)

于 2010-11-26T18:35:30.863 回答
3

阿拉伯语听起来像“加利福尼亚”吗?如果是这样,您将需要在“听起来像”的基础上进行比较,这很可能会导致音素转换。

于 2010-11-26T18:25:58.243 回答
2

将所有名称音译成相同的语言(例如英语)进行搜索,并使用 Levenstein 编辑距离来计算名称的语音表示之间的相似度。如果您只是将查询与每个名称进行比较,这会很慢,但是如果您将数据库中的所有地名预先索引到Burkhard-Keller 树中,则可以通过与查询词的编辑距离来有效地搜索它们。

此技术允许您根据名称的实际匹配程度对名称进行排序。与使用变音位或双变音位相比,您可能更有可能以这种方式找到匹配项,尽管这更难实现。

于 2010-11-26T19:21:45.830 回答
1

您的 Google 建议听起来也不错,但您应该尝试一下,并确保您对它的准确性感到满意。在测试它在希伯来语和英语之间的工作方式时,我注意到有时谷歌在翻译成希伯来语时只是在英文字母中留下英文地名。

于 2010-11-28T00:42:58.893 回答
0

您如何在客户端使用一些本地化来显示值。或者为家乡创建一个包装类,它将覆盖equal(Object)加利福尼亚的实例将返回true“加利福尼亚”和“كاليفورنيا”(对不起,如果我在这里犯了错误,只是从上面复制粘贴)。

于 2010-11-26T18:30:18.470 回答
0

这听起来像是一个经典的编码问题。每当您传输非 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 容器到数据库

数据库需要具有正确的编码,否则排序等将不正确。

MySQL 的示例 my.cnf

[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.printnln()不能依靠来验证事情。首先,它取决于 java vm 默认编码,使用 System.property 设置-Dfile.encoding=UTF-8,其次,执行 System.out 的终端需要设置并支持 UTF-8。不要相信 System.out!

一旦 VM 中的 String 是正确的字符,它就不会受到编码的影响。在内存中,字符串中的每个字符都是 16 位的,它(几乎)涵盖了 utf-8 可以编码的所有字符。您可以将字符串写入文件并调查该文件以真正了解您的 VM 中是否有正确的字符。

于 2010-11-26T18:51:49.443 回答