Pregunta

En mi aplicación web que estoy usando dos diferentes idiomas a saber Inglés y Árabe .

Tengo un Cuadro de búsqueda en mi aplicación web en la que si se realiza una búsqueda por nombre o parte del nombre entonces será recuperar los valores de base de datos mediante la comparación de la "Procedencia" del usuario

Explicación:

Al igual que si un usuario pertenece a ciudad natal "California" y busca un nombre por ejemplo "Victor" a continuación, mi consulta en primer lugar ver el las personas que tienen la misma ciudad "California" y en la lista de personas que tienen "California" como la ciudad natal del "Victor" * < em> nombre * se buscará y obtener los usuarios tener "California" como su strong> ciudad < y " Victor " en su nombre o parte del nombre.

La problema es, si la ciudad natal "California" es salvado en Inglés se comparará y recuperar el valores. Pero "California" será guardado como "??????????" en árabe . En este caso, el Comparación ciudad natal falla y no puede recuperar los valores.

Deseo que mi consulta debe encontrar ambos son iguales ciudad natal y recuperar los valores. ¿Es posible?

Lo que alternativo que debería pensar de esta lógica de comparación. Estoy confundido. Cualquier sugerencia por favor?

EDIT: * Tengo una idea tal que si el ciudad se puso entonces es posible utilizar el traductor de Google o Transliterator y cambiar la ciudad natal a otro idioma. si está en Inglés y luego a árabe o si está en Inglés y luego a árabe y dar los resultados de la búsqueda que unen ambos. Cualquier sugerencia? *

¿Fue útil?

Solución

Transliterate todos los nombres en el mismo idioma (por ejemplo, Inglés) para la búsqueda y el uso Levenstein distancia de edición para calcular la similitud entre las representaciones fonéticas de los nombres. Esta será lenta si simplemente comparar su consulta con cada nombre, pero si usted pre-índice de todos los nombres de lugares en su base de datos en un Burkhard-Keller árbol , entonces puede ser eficiente buscado por editar la distancia desde el término de consulta.

Esta técnica le permite clasificar los nombres de por lo cerca que realmente coinciden. Usted es probablemente más probable encontrar un partido de esta manera que el uso de metaphone o doble metaphone, aunque esto es más difícil de implementar.

Otros consejos

El problema se encuentra con que desea es información / necesidad en 2 o más idiomas y desea que el usuario de la aplicación para poder usar ambas lenguas. Un enfoque posible es mantener varios registros por artículo y que incluye un código de idioma como parte de la clave primaria, por ejemplo, si su registro es

id   hometown   name
001  California Victor

se podría introducir un código de idioma y almacenar

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

a continuación, su búsqueda sería corresponde a ninguno de "California" o "??????????" que le da el id 001, que luego se puede utilizar para cargar todas las traducciones de sus datos (o sólo los datos en el lenguaje corriente de salida.) Este sceme puede ser utilizado con cualquier número de idiomas y tiene la ventaja añadida de que no es necesario pre-rellenar la tabla. Puede añadir nuevas traducciones de los registros cuando se conocen.

(Advertencia:. Yo sólo repetía la cadena árabe, no puedo leerlo, también 'ar' muy probablemente no es el código de idioma correcto para Aribic pero se entiende la idea)

¿El árabe sonido como "California"? Si es así, tendrá que comparar en un "sonidos-como" -basis cual dará lugar muy probablemente en una conversión fonema.

Sus sonidos de sugerencias de Google, como también podría ser una buena idea, pero debe jugar un rato con él, y asegúrese de que usted es feliz con su precisión. En la prueba de cómo funcionaba va entre el hebreo y el Inglés, me di cuenta de que a veces le toca a Google en inglés los nombres de lugares en las letras inglesas en la traducción al hebreo.

¿Qué tal se utiliza alguna localización en el lado del cliente a los valores de indicación. O crear una clase contenedora para ciudad que anulará equal(Object) de la manera la instancia para California volverá true tanto para "California" y "??????????" (lo siento si he cometido error aquí, sólo tienes que copiar-pegar de más arriba).

Esto suena como un problema de codificación clásica. Cada vez que se transfiera carácter no ASCII que necesita para asegurarse de que está lo codifica derecha. Para el árabe y el Inglés sospecho que puede utilizar UTF-8 (pero no sé árabe, por lo que puede ser malo).

En su configuración es probable que tenga los siguientes puntos:

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

En cualquiera de las interfaces del sistema, donde caracteres (16 bits) se convierten en byte (8 bits) tendrá que asegurarse de que la codificación es correcta.

Navegador de contenedor servlet

Al hacer peticiones GET o POST de una página web, el navegador se verá en 1) El cabeceras HTTP desde el servidor, especialmente el Content-Type: text/html; charset=UTF-8, que si está presente, se anulará el código HTML meta cabecera <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">.

En el lado del contenedor de servlets, la HttpServletRequest.getParameter (), tendrá una codificación que lo más probable es que tenga que configurar en la configuración del servidor.

server.xml del Ejemplo tomcat

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

Servlet recipiente a base de datos

Las necesidades de base de datos para tener las codificaciones correctas, o clasificación, etc. no será correcta.

Ejemplo my.cnf para 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 

A continuación, el JDBC-conductor necesita ser establecido para UTF-8.

Ejemplo JDBC cadena de conexión

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

System.out

System.out.printnln() no puede ser invocada para verificar las cosas. En primer lugar, depende de la codificación predeterminada Java VM, juego utilizando System.property -Dfile.encoding=UTF-8, en segundo lugar tendrá que ser ajustado en el apoyo y UTF-8 el terminal en la que se hace la System.out. No confíe en System.out!

Una vez que una cadena en la máquina virtual es un carácter propio, que no se verá afectado por la codificación. En memoria cada caracter en una cadena es de 16 bits, que (casi) cubre todos los caracteres que codifican UTF-8 lata. Se puede escribir la cadena en un archivo e investigar el archivo en realidad saber si tiene caracteres correctos en su máquina virtual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top