java - tutorial - ¿Por qué las letras árabes no se están insertando en la base de datos?
tercera letra del alfabeto árabe (1)
Estoy ayudando a uno de mis amigos. Él está creando una aplicación web usando JSF 2.0 y mysql.
Al crear la base de datos, ha utilizado la consulta a continuación.
CREATE DATABASE dbName DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Hasta la fecha, el sitio web funciona bien. Hoy el cliente intentó ingresar texto en árabe y dijeron que la salida es extraña. Lo que hace mi amigo después de ingresar los datos en DB, también imprime los mismos datos en otra página diciendo Congratulations, XYZ ABC is added successfully
. Sin embargo, él ve la salida como Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully
Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully
Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully
. No entiendo por qué se pone así cuando los caracteres de la Base de datos están configurados correctamente.
El contenido web.xml es el siguiente.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
600
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
<filter>
<filter-name>restrict</filter-name>
<filter-class>com.sac.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>restrict</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>DisplayImage</servlet-name>
<servlet-class>com.sac.databean.DisplayImage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayImage</servlet-name>
<url-pattern>/DisplayImage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SaveMyImage</servlet-name>
<servlet-class>com.sac.databean.SaveMyImage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SaveMyImage</servlet-name>
<url-pattern>/SaveMyImage</url-pattern>
</servlet-mapping>
<!-- for not using css and js of default richfaces -->
<context-param>
<param-name>org.richfaces.SKIN</param-name>
<param-value>plain</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.LoadStyleStrategy</param-name>
<param-value>None</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.enableControlSkinning</param-name>
<param-value>false</param-value>
</context-param>
<!-- for not using css and js of default richfaces -->
</web-app>
En cada página .xhtml , tiene <?xml version=''1.0'' encoding=''UTF-8'' ?>
Por favor, hágame saber si necesita algo más.
Editar 1
En mi filtro JSF, también agregué req.setCharacterEncoding("UTF-8");
en doFilter()
. Todavía en la base de datos veo ???????????
Editar 2
En la página JSF tengo <h:inputText value="#{PersonalInformationDataBean.fullName}">
y cuando fullName
valor fullName
en Java Bean como System.out.println("my name while entering is " + fullName);
m Obtengo la salida como my name while entering is ???????????? ????
my name while entering is ???????????? ????
.
Esto significa que hay un problema al ingresar datos
¿Alguien puede ayudar a lo que está pasando ODD?
Sin embargo, él ve la salida como Felicidades, Ù? ظاÙ? تÙ? Ù? Ù? Ø Ù? تÙ? Ù? Ù? ØμدÙ? Ù? Ù? Ù? بÙ? Ø|Ø © se agrega con éxito. No entiendo por qué se pone así cuando los caracteres de la Base de datos están configurados correctamente.
Esto se conoce como Mojibake . Esto no es un problema de codificación de base de datos, sino un problema de codificación HTTP. Establecer la codificación de caracteres de la solicitud POST como lo hizo es, de hecho, la solución adecuada.
Editar 1: en mi filtro JSF, también agregué
req.setCharacterEncoding("UTF-8");
endoFilter()
. Todavía en la base de datos veo ???????????
Los signos de interrogación aparecen cuando los dos lados de la conexión conocen su propia codificación. Los caracteres enviados / recuperados que no están cubiertos por la codificación de un lado serán reemplazados por signos de interrogación. Los caracteres arábigos no aparecen en ISO-8859-1 y, por lo tanto, se reemplazan por signos de interrogación. Esa es la diferencia con Mojibake según el cual los caracteres se envían sin verificar si la codificación utilizada por el otro lado realmente es compatible con el personaje. Terminará caracteres codificados incorrectamente que se presenta como una secuencia ininteligible de caracteres.
En este caso particular, el controlador JDBC es consciente de que está usando el ISO-8859-1 por defecto para transmitir los caracteres a DB, mientras que los caracteres recuperados están en UTF-8 (el controlador MySQL JDBC no mira el DB codificación de tabla, aunque se haya configurado correctamente en UTF-8 en su caso). Debe indicar explícitamente al controlador JDBC que use UTF-8 para decodificar caracteres antes de transmitir datos a DB. Esto se debe hacer como propiedades de conexión JDBC que se definen como parámetros de cadena de consulta en la URL de JDBC, así:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Si está utilizando un origen de datos gestionado por contenedor, simplemente especifique esas propiedades por separado de la misma manera que lo hizo para el nombre de usuario y la contraseña
useUnicode=yes
characterEncoding=UTF-8