为什么阿拉伯字母没有插入数据库? [英] Why Arabic Letters Are Not Inserting In Database?

查看:122
本文介绍了为什么阿拉伯字母没有插入数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在帮助我的一个朋友。他正在使用JSF 2.0和Linux创建Web应用程序。 mysql。



在创建数据库时,他使用了以下查询。

  CREATE DATABASE dbName DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; 

到目前为止,网站工作正常。今天客户端尝试输入阿拉伯语文本,他们说输出结果很奇怪。我的朋友做的是在将数据输入DB之后,他还在另一页上打印相同的数据,说祝贺,XYZ ABC成功添加。但他认为输出为祝贺,Ù?ظاÙ? تÙ?Ù?Ù?Ø©Ù?تÙ?Ù?Ù? ØμدÙ?U& Ù?Ù?ب??Ø|Ø©成功添加。当数据库字符设置正确时,我不明白为什么会这样。



web.xml 内容如下。

 <?xml version =1.0encoding =UTF-8?> 
< web-app version =3.0xmlns =http://java.sun.com/xml/ns/javaeexmlns:xsi =http://www.w3.org/2001/ XMLSchema-instancexsi: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>开发< / 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>

<! - 不使用默认richfaces的css和js - >
< 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>无< / param-value>
< / context-param>
< context-param>
< param-name> org.richfaces.enableControlSkinning< / param-name>
< param-value> false< / param-value>
< / context-param>
<! - 不使用默认richfaces的css和js - >

< / web-app>

在每个 .xhtml 页面上,他有 <?xml version ='1.0'coding ='UTF-8'?>



如果您还有其他需要,请与我们联系。






编辑1



在我的JSF过滤器中,我还在 doFilter()中添加了 req.setCharacterEncoding(UTF-8); 。仍然在数据库中,我看到 ??????????????????????????????? b

$ hr

编辑2



在JSF页面中,我有< h:inputText value =#{PersonalInformationDataBean.fullName}> 当我在Java bean中打印 fullName 值为 System.out.println(输入时我的名字是 + fullName); m我输入我输入的名字是????????????? ????



这意味着输入数据时出现问题



有人可以帮助ODD吗?

解决方案


然而他看到输出为恭喜,Ù?ظاÙ? تÙ?Ù?Ù?Ø©Ù?تÙ?Ù?Ù? ØμدÙ?U& Ù?Ù?ب??Ø|Ø©成功添加。我不明白为什么在正确设置数据库字符时他会这样。


这被称为 Mojibake 。这不是数据库编码问题,而是HTTP编码问题。像你一样设置POST请求字符编码确实是正确的解决方案。







编辑1:在我的JSF过滤器中,我还在 doFilter() req.setCharacterEncoding(UTF-8); $ C>。仍在数据库中我看到了?????????????????????????????????????????????? >连接的两个侧都是识别的自己的编码。未被一侧编码覆盖的已发送/检索字符将替换为问号。 ISO-8859-1中没有出现阿拉伯字符,因此它们被问号取代。这与Mojibake的区别在于,在不检查对方使用的编码是否真的支持该角色的情况下发送了字符。你最终会得到错误编码的字符,这些字符本身就是一个难以理解的字符序列。



在这种特殊情况下,JDBC驱动程序本身就知道它正在使用ISO-默认情况下,8859-1将字符传输到DB,而检索到的字符为UTF-8(MySQL JDBC驱动程序不查看数据库表编码,即使在您的情况下已正确设置为UTF-8) 。在将数据传输到DB之前,您需要明确告诉JDBC驱动程序使用UTF-8来解码字符。这将作为JDBC连接属性来完成,这些属性在JDBC URL中被定义为查询字符串参数,如下所示:

  jdbc:mysql:// localhost:3306 / db_name?useUnicode = yes& characterEncoding = UTF-8 

如果您使用的是容器管理的数据源,则只需使用与用户名和密码相同的方式单独指定这些属性

  useUnicode = yes 
characterEncoding = UTF-8



参见:




I am helping to one of my friend. He is creating web-application using JSF 2.0 & mysql.

While creating database he have used below query.

CREATE DATABASE dbName DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

Till date website is working fine. Today client tried entering Arabic text and they said that the output is coming weird. What my friend do is after entering the data to DB, he also prints the same data on another page saying Congratulations, XYZ ABC is added successfully. However he see output as Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully. I don't understand why he get like that when Database characters are set properly.

web.xml content is as below.

<?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>

On each .xhtml page, he have <?xml version='1.0' encoding='UTF-8' ?>

Please let me know if you need anything else.


Edit 1

In my JSF filter, I also added req.setCharacterEncoding("UTF-8"); in doFilter(). Still in Database I see ???????????


Edit 2

In JSF page I have <h:inputText value="#{PersonalInformationDataBean.fullName}"> and when I print the fullName value in Java bean as System.out.println("my name while entering is " + fullName);m I get output as my name while entering is ???????????? ????.

This means there is problem while entering data

Can someone help what is going ODD?

解决方案

However he see output as Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully. I don't understand why he get like that when Database characters are set properly.

This is known as Mojibake. This is not a DB encoding problem, but a HTTP encoding problem. Setting the POST request character encoding as you did is indeed the proper solution.


Edit 1: In my JSF filter, I also added req.setCharacterEncoding("UTF-8"); in doFilter(). Still in Database I see ???????????

Question marks occur when the both sides of the connection are aware of their own encoding. Sent/retrieved characters which are not covered by the encoding of one side will be replaced by question marks. Arabic characters doesn't occur in ISO-8859-1 and hence they're replaced by question marks. That's the difference with Mojibake whereby characters are been sent without checking if the encoding used by the other side really supports the character. You'll end up incorrectly encoded characters which presents itself as an unintelligible sequence of characters.

In this particular case, the JDBC driver is by itself aware that it's using ISO-8859-1 by default to transmit the characters to DB, while the retrieved characters are in UTF-8 (the MySQL JDBC driver doesn't look at the DB table encoding, even though it's properly been set to UTF-8 in your case). You need to explicitly tell the JDBC driver to use UTF-8 to decode characters before transmitting data to DB. This is to be done as JDBC connection properties which are definied as query string parameters in the JDBC URL like so:

jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8

If you're using a container-managed datasource, then just specify those properties separately the same way as you did for the username and password

useUnicode=yes
characterEncoding=UTF-8

See also:

这篇关于为什么阿拉伯字母没有插入数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆