Domanda

Nella mia applicazione web che sto usando due diverse lingue e cioè English e arabo .

Ho un ricerca nella mia applicazione web in cui, se si cerca per nome o parte del nome allora sarà recuperare i valori dal DB confrontando il "Hometown" degli utenti

Spiegazione:

Come se un utente appartiene a città natale "California" e lui cerca un nome per esempio "Victor" , quindi la mia domanda sarà prima vedere il le persone che stanno avendo il stessa città natale "California" e nella lista di persone che hanno "California" come città natale del "Victor" * < em> nome * sarà cercato e recuperare gli utenti avere "California" come il loro città natale e " Victor " nel loro nome o parte del nome.

Il problema è se la città natale "California" è salvato in English sarà confrontare e recuperare il valori. Ma "California" sarà salvato come "كاليفورنيا" in arabo . In questo caso il città natale confronto fallisce e cant recuperare i valori.

Vorrei che la mia domanda dovrebbe trovare entrambi sono stessa città natale e recuperare i valori. E 'possibile?

Cosa alternativo che dovrei pensare per questa logica per il confronto. Sono confuso. Qualsiasi suggerimento per favore?

Modifica * Ho un'idea tale che se la città natale è ottenuto quindi è possibile utilizzare Google traduttore o transliterator e cambiare la città natale per un'altra lingua. se è in inglese quindi su arabo o se è in inglese poi araba e dare i risultati della ricerca che unisce entrambi. Ogni suggerimento? *

È stato utile?

Soluzione

traslitterare tutti i nomi nella stessa lingua (ad esempio inglese) per la ricerca e l'uso Levenstein modificare la distanza per calcolare la somiglianza tra le rappresentazioni fonetiche dei nomi. Questo sarà lenta se si confronta semplicemente la query con ogni nome, ma se si pre-indicizzare tutti i nomi di luogo nel database in un Burkhard-Keller albero , allora possono essere efficientemente cercato da modificare distanza dal termine di ricerca.

Questa tecnica consente di ordinare i nomi in base alla vicinanza in realtà corrispondono. Probabilmente sei più probabilità di trovare una corrispondenza in questo modo di utilizzare metaphone o doppio-metaphone, anche se questo è più difficile da attuare.

Altri suggerimenti

Il problema che si incontra è che si desidera informazioni / necessità in 2 o più lingue e si desidera l'utente della vostra applicazione per essere in grado di utilizzare entrambe le lingue. Un possibile approccio è quello di mantenere più record per voce e comprendente un codice di lingua come parte della chiave primaria, per esempio se il record è

id   hometown   name
001  California Victor

si potrebbe introdurre un codice di lingua e conservare

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

allora la vostra ricerca corrisponderà sia "California" o "كاليفورنيا" dando l'id 001, che è quindi possibile utilizzare per caricare tutte le traduzioni dei dati (o solo i dati nella lingua corrente di uscita). Questo sceme può essere utilizzato con qualsiasi numero di lingue e ha il vantaggio che non è necessario per precompilare il tavolo. È possibile aggiungere nuove traduzioni per i record, quando queste diventano note.

(Caveat:. Ho appena ripetuto la stringa di arabica, non riesco a leggerlo, anche 'ar' molto probabilmente non è il codice della lingua corretta per aribic ma si ottiene l'idea)

Fa l'arabo suoni come "California"? Se è così hai bisogno di confrontare su un "suoni-like" -basis che sarà molto probabilmente in una conversione fonema.

I tuoi Google suoni suggerimento come potrebbe anche essere una buona, ma si dovrebbe giocare con essa, ed essere sicuri che sei felice con la sua precisione. Nel test di come ha funzionato in corso tra l'ebraico e l'inglese, ho notato che a volte Google lascia solo nomi di luogo inglesi in lettere inglesi quando si traduce all'ebraico.

Che ne dite di si utilizzano alcuni localizzazione sul lato client per valori di visualizzazione. O creare una classe wrapper per città natale che avrà la precedenza equal(Object) nel modo l'istanza per la California tornerà true sia per "California" e "كاليفورنيا" (scusate se ho fatto errore qui, basta copiare e-incollato da sopra).

Questo suona come un problema di codifica classico. Ogni volta che si trasferiscono carattere non ASCII è necessario assicurarsi che si sta codifica bene. Per arabo e inglese ho il sospetto è possibile utilizzare UTF-8 (ma non so arabica, quindi potrebbe essere sbagliato).

Nella vostra configurazione si avrà probabilmente i seguenti punti:

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

In una qualsiasi delle interfacce di sistema in cui caratteri (16 bit) vengono convertiti in byte (8 bit) è necessario assicurarsi che la codifica è corretta.

Browser per Servlet contenitore

Quando si esegue GET o POST richieste da una pagina web, il browser esaminerà 1) Il intestazioni HTTP dal server, in particolare il Content-Type: text/html; charset=UTF-8, che se presente, sovrascriverà il codice HTML meta intestazione <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">.

Sul lato servlet container, il HttpServletRequest.getParameter (), avrà una codifica che molto probabilmente necessario impostare nelle impostazioni del server.

server.xml di Tomcat Esempio

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

servlet container per database

Le esigenze di database per avere le codifiche corretti, o l'ordinamento ecc non sarà di destra.

Esempio my.cnf per 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 

Poi il JDBC-conducente deve essere impostato per UTF-8.

Esempio JDBC stringa di connessione

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

System.out

System.out.printnln() non può essere invocata per verificare le cose. Prima dipende dalla codifica predefinita java vm, insieme con System.property -Dfile.encoding=UTF-8, in secondo luogo il terminale in cui si fa lo System.out, dovrà essere impostato e supporto UTF-8. Non fidarti di System.out!

Una volta che una stringa nella VM è un carattere proprio, non sarà influenzato dalla codifica. In memoria ogni carattere in una stringa è di 16 bit, che (quasi) copre tutti i caratteri che utf-8 può codificare. È possibile scrivere la stringa su un file e indagare il file per davvero so se hai caratteri corrette nel VM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top