Как сравнить различные языковые строковые значения в Java?

StackOverflow https://stackoverflow.com/questions/4287694

  •  28-09-2019
  •  | 
  •  

Вопрос

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

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

Объяснение:

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

id   hometown   name
001  California Victor

Вы могли бы представить код языка и хранить

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример Tomcat 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 Connect String

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

Система системы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top