Как сравнить разные значения языка String в JAVA? - PullRequest
1 голос
/ 26 ноября 2010

В моем веб-приложении я использую два разных языка, а именно английский и арабский .

У меня есть окно поиска в моем веб-приложении, в котором, если мы осуществляем поиск по имени или части имени, оно будет извлекать значения из БД, сравнивая «Родной город» пользователя

Объяснение:

Например, если пользователь принадлежит родной город "Калифорния" и он ищет имя скажем "Виктор" затеммой запрос сначала увидит людей, которые имеют тот же родной город "Калифорния" и в списке людей, у которых "Калифорния" как родной город "Виктор" * имя * будет найдено, и оно получит пользователей, имеющих "Калифорния" в качестве родного города и " victor"в их имени или части имени.

Проблема заключается в том, если родной город " Калифорния " сохранен в Английский будет сравнивать и получать значения.Но "Калифорния" будет сохранено как "كاليفورنيا" на арабском .В этом случае сравнение в родном городе не удается , и он не может получить значения.

Мне бы хотелось, чтобы в моем запросе были указаны оба родных города и были получены значения.Возможно ли это?

Что альтернатива Я должен подумать об этой логике для сравнения.Я сбит с толку.Любое предложение, пожалуйста?

РЕДАКТИРОВАТЬ: * У меня есть идея, что если получен родной город , то можно использовать Google переводчик или транслитератор и изменить родной город надругой язык.если это на английском, то на арабском или если на английском, то на арабском и дать результаты поиска, объединяющие оба.Любое предложение? *

Ответы [ 6 ]

6 голосов
/ 26 ноября 2010

Проблема, с которой вы сталкиваетесь, заключается в том, что вы хотите / нуждаетесь в информации на 2 или более языках и хотите, чтобы пользователь вашего приложения мог использовать оба языка. Один из возможных подходов заключается в том, чтобы хранить несколько записей на элемент и включать код языка в качестве части первичного ключа, например, если ваша запись

id   hometown   name
001  California Victor

Вы можете ввести код языка и сохранить

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

тогда ваш поиск будет соответствовать "California" или "كاليفورنيا", давая вам идентификатор 001, который вы затем сможете использовать для загрузки всех переводов ваших данных (или только данных на текущем языке вывода.) Этот сценарий может быть используется с любым количеством языков и имеет дополнительное преимущество, заключающееся в том, что вам не нужно предварительно заполнять таблицу. Вы можете добавить новые переводы для записей, когда они станут известны.

(Предостережение: я только что повторил вашу арабскую строку, я не могу ее прочитать, а также 'ar', скорее всего, неправильный код языка для арибского языка, но вы поняли идею.)

3 голосов
/ 26 ноября 2010

Арабский звучит как "Калифорния"?Если это так, вам нужно будет сравнить «по звуку», что, скорее всего, приведет к преобразованию фонемы.

2 голосов
/ 26 ноября 2010

Транслитеруйте все имена на один и тот же язык (например, английский) для поиска и используйте расстояние редактирования Левенштейна, чтобы вычислить сходство между фонетическими представлениями имен. Это будет медленным, если вы просто сравниваете свой запрос с каждым именем, но если вы предварительно индексируете все топонимы в своей базе данных в дерево Буркхарда-Келлера , тогда их можно будет эффективно искать по расстоянию редактирования из условия запроса.

Этот метод позволяет вам сортировать имена по тому, насколько близко они на самом деле совпадают. Вы, вероятно, с большей вероятностью найдете совпадение таким образом, чем при использовании метафона или двойного метафона, хотя это сложнее реализовать.

1 голос
/ 28 ноября 2010

Ваше предложение от Google звучит так, как будто оно также может быть хорошим, но вы должны поэкспериментировать с ним и быть уверенным, что вы довольны его точностью. Тестируя, как это работает между ивритом и английским, я заметил, что иногда Google просто оставляет английские топонимы английскими буквами при переводе на иврит.

0 голосов
/ 26 ноября 2010

Это звучит как классическая проблема кодирования.Всякий раз, когда вы переносите не-ascii символ, вам нужно убедиться, что вы правильно его кодируете.Для арабского и английского я подозреваю, что вы можете использовать UTF-8 (но я не знаю арабский, так что это может быть неправильно).

В вашей настройке у вас, вероятно, будут следующие пункты:

Browser <-> Servlet container <-> Database
                   |
                System.out

В любом из системных интерфейсов, в которых символы (16-разрядные) преобразуются в байты (8-разрядные), вам необходимо убедиться в правильности кодировки.

Браузерв контейнер сервлета

Когда вы выполняете запросы GET или POST с веб-страницы, браузер просматривает: 1) HTTP-заголовки с сервера, особенно Content-Type: text/html; charset=UTF-8, который, если присутствует, переопределит HTMLмета заголовок <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">.

На стороне контейнера сервлета HttpServletRequest.getParameter () будет иметь кодировку, которую вам, скорее всего, нужно будет установить в настройках сервера.

Пример tomcat's server.xml

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
           maxThreads="2000"                
           connectionTimeout="20000" 
           redirectPort="8443" />

Контейнер сервлета в базу данных

База данных должна иметь правильные кодировки, иначе сортировка и т. Д. Будут неправильными.

Пример my.cnf для 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 

Тогда JDBC-драйвер должен быть установлен для UTF-8.

Пример строки подключения JDBC

jdbc:mysql://localhost:3306/rimario?useUnicode=true&characterEncoding=utf-8

System.out

System.out.printnln() не может быть использован для проверки.Во-первых, это зависит от кодировки java vm по умолчанию, установленной с помощью System.property -Dfile.encoding=UTF-8, во-вторых, терминал, в котором вы делаете System.out, должен быть настроен и поддерживать UTF-8.Не доверяйте System.out!

Если строка в виртуальной машине является правильным символом, она не будет затронута кодированием.В памяти каждый символ в строке является 16-битным, что (почти) охватывает все символы, которые может кодировать utf-8.Вы можете записать строку в файл и исследовать файл, чтобы действительно знать , если у вас есть правильные символы в вашей виртуальной машине.

0 голосов
/ 26 ноября 2010

Как насчет использования некоторой локализации на стороне клиента для отображения значений. Или создайте класс-оболочку для родного города , который будет переопределять equal(Object) так, как экземпляр для California будет возвращать true как для "California", так и для "فاليفورنيا" (извините, если я допустил ошибку, просто скопируйте -печено сверху).

...