Frage

In meiner Web-Anwendung Ich bin mit zwei verschiedenen Sprachen nämlich Englisch und Arabisch .

Ich habe eine Suchfeld in meiner Web-Anwendung, in der, wenn wir nach dem Namen oder einen Teil des Namens suchen, dann wird es die Werte von DB abrufen, indem Sie die „Heimatstadt“ zu vergleichen des Benutzers

Erklärung:

Wie, wenn ein Benutzer gehört Heimatstadt "California" und er sucht einen Namen sagen "Victor" , dann wird meine Abfrage zuerst sehen, die Menschen, die die gleiche Heimatstadt "California" und in der Liste der Menschen haben, die haben "California" als Heimatstadt des "Victor" * < em> name * wird durchsucht und es abrufen die Benutzer mit "California" als Heimatstadt und „ Sieger “in ihrem Namen oder einen Teil des Namens.

Das Problem ist, wenn die Heimatstadt "California" ist gespeichert in Englisch wird es vergleichen und Abrufen des Werte. Aber "California" wird gespeichert als "??????????" auf Arabisch . In diesem Fall wird die Heimatstadt Vergleich fehlschlägt und es kann nicht die Werte abrufen.

Ich wünsche, dass meine Anfrage beide gleiche Heimat finden soll und die Werte abrufen. Ist es möglich?

Was alternativen I zum Vergleich für diese Logik denken sollte. Ich bin verwirrt. Jeder Vorschlag, bitte?

EDIT: * Ich habe eine Idee, dass, wenn die Heimatstadt dann haben wird, ist es möglich, Google Übersetzer oder Transliterator und ändern Sie die Heimatstadt in einer anderen Sprache zu verwenden. wenn es in Englisch ist dann auf Arabisch oder wenn es in Englisch ist dann auf arabisch und die Suchergebnisse geben beide verbinden. Jeder Vorschlag? *

War es hilfreich?

Lösung

Transliterate alle Namen in die gleiche Sprache (zum Beispiel Englisch) für die Suche und Verwendung Levenstein Editierdistanz die Ähnlichkeit zwischen den Laut Darstellungen der Namen zu berechnen. Dies wird langsam sein, wenn Sie einfach Ihre Abfrage mit jedem Namen vergleichen, aber wenn Sie alle Ortsnamen in Ihrer Datenbank in ein Burkhard-Keller Baum , dann können sie effizient bearbeiten Abstand von der Abfrage Begriff gesucht.

Diese Technik ermöglicht es Ihnen, Namen zu sortieren, wie nahe auch wirklich zueinander passen sie. Du bist wahrscheinlich eher ein Spiel auf diese Weise zu finden, als mit Metaphone oder Doppel Metaphone, obwohl dies schwieriger zu implementieren ist.

Andere Tipps

Das Problem auftreten, dass Sie in zwei oder mehr Sprachen / müssen Informationen wollen, und Sie wollen, dass die Benutzer Ihrer Anwendung in der Lage sein, beide Sprachen zu verwenden. Ein möglicher Ansatz ist es, mehrere Datensätze pro Element zu halten ist und einen Sprachcode als Teil des Primärschlüssels, zum Beispiel, wenn Ihr Datensatz

id   hometown   name
001  California Victor

könnten Sie einen Sprachcode und speichern

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

dann die Suche würde entweder „California“ oder „??????????“ entsprechen geben Sie die ID 001, die Sie dann alle Übersetzungen Ihrer Daten zu laden verwenden, um (oder nur die Daten in der aktuellen Ausgabe Sprache). Diese sceme sein kann mit einer beliebigen Anzahl von Sprachen verwendet und hat den zusätzlichen Vorteil, dass Sie nicht die Tabelle prefill müssen. Sie können neue Übersetzungen für Datensätze hinzufügen, wenn sie bekannt werden.

(Caveat:. Ich habe Ihre arabische Zeichenfolge nur wiederholt, ich kann es nicht lesen, auch ‚Ar‘ höchstwahrscheinlich nicht der richtige Sprachcode für aribic aber Sie erhalten die Idee)

Ist die Arabisch Ton wie "California"? Wenn ja, müssen Sie auf einem „Sounds-like“ -Basis welches höchstwahrscheinlich zu einer Phonem-Konvertierung vergleichen.

Ihr Google-Vorschlag klingt wie könnte es auch eine gute sein, aber Sie sollten mit ihm spielen, um, und stellen Sie sicher, dass Sie zufrieden mit seiner Genauigkeit. Bei der Prüfung, wie es geht zwischen Hebräisch und Englisch arbeitete, bemerkte ich, dass manchmal Ortsnamen Englisch nur in englischen Buchstaben Google verläßt, wenn auf Hebräisch übersetzen.

Wie wäre es Ihnen eine Lokalisierung auf Client-Seite Anzeigewerte verwenden. Oder erstellen Sie eine Wrapper-Klasse für Heimatstadt , das außer Kraft setzen equal(Object) in der Art und Weise die Instanz für Kalifornien wird true sowohl für „California“ zurückzukehren und „??????????“ (sorry, wenn ich Fehler hier gemacht, einfach kopieren kleistert aus oben).

Das klingt wie eine klassische Codierung Problem. Jedes Mal, wenn Sie nicht-ASCII-Zeichen übertragen müssen Sie sicherstellen, sind Sie es richtig codiert. Für Arabisch und Englisch vermute ich Sie UTF-8 verwenden können (aber ich weiß nicht, arabicum, so kann es falsch sein).

In Ihrem Setup werden Sie wahrscheinlich die folgenden Punkte:

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

In jedem der Systemschnittstellen, wo Zeichen (16 Bit) umgewandelt werden Byte (8 Bit) Sie machen müssen sicherstellen, dass die Codierung korrekt ist.

Browser auf Servlet-Container

Wenn Sie GET oder POST-Anfragen von einer Web-Seite zu tun, wird der Browser auf 1 anschauen) Die HTTP-Header vom Server, vor allem die Content-Type: text/html; charset=UTF-8, die falls vorhanden, überschreiben Sie die HTML-Meta-Header <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">.

Auf der Servlet-Container Seite, die HttpServletRequest.getParameter (), wird eine Codierung hat, dass Sie höchstwahrscheinlich Notwendigkeit, Satz in den Servereinstellungen.

Beispiel Tomcats server.xml

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

Servlet-Container zur Datenbank

Die Datenbank muss die richtigen Codierungen haben, oder Sortieren usw. nicht richtig sein.

Beispiel my.cnf für 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 

Dann muss die JDBC-Treiber für UTF-8 gesetzt werden.

Beispiel JDBC-Verbindungszeichenfolge

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

System.out

System.out.printnln() kann sich nicht darauf verlassen, Dinge zu überprüfen. Zuerst es auf der Java Virtual Machine Standard-Kodierung abhängig ist, Satz System.property -Dfile.encoding=UTF-8 verwenden, zweitens das Terminal, in dem Sie die System.out tun, müssen und die Unterstützung von UTF-8 gesetzt werden. Vertrauen Sie nicht System.out!

Sobald ein String in der VM ein richtiges Zeichen ist, wird es nicht durch die Codierung beeinflusst werden. Im Speicher ist jedes Zeichen in einer Zeichenkette 16-Bit, die (fast), um all Zeichen umfassen, die UTF-8 Dose kodieren. Sie können die Zeichenfolge in eine Datei schreiben und die Datei zu untersuchen, um wirklich weiß , wenn Sie richtig Zeichen in Ihrer VM bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top