我正在帮助我的一个朋友。他正在使用JSF 2.0和Linux创建Web应用程序。 MySQL的。
创建数据库时,他使用了以下查询。
CREATE DATABASE dbName DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
截止日期网站工作正常。今天客户尝试输入阿拉伯语文本,他们说输出结果很奇怪。我的朋友在将数据输入数据库之后所做的是,他还在另一页Congratulations, XYZ ABC is added successfully
上打印相同的数据。但他看到输出为Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully
。我不明白为什么在正确设置数据库字符时他会这样。
web.xml 内容如下。
<?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>
在每个 .xhtml 页面上,他有<?xml version='1.0' encoding='UTF-8' ?>
如果您还有其他需要,请告诉我。
在我的JSF过滤器中,我还在req.setCharacterEncoding("UTF-8");
中添加了doFilter()
。仍然在数据库中,我看到???????????
在JSF页面中,我有<h:inputText value="#{PersonalInformationDataBean.fullName}">
,当我在Java bean中将fullName
值打印为System.out.println("my name while entering is " + fullName);
时,我输出为my name while entering is ???????????? ????
。
这表示输入数据时出现问题
有人可以帮助ODD吗?
答案 0 :(得分:3)
但他认为输出是祝贺,Ù?ظاÙ? تÙ?Ù?Ù?Ø©Ù?تÙ?Ù?Ù? ØμدÙ?U& Ù?Ù?ب??Ø|Ø©成功添加。我不明白为什么在正确设置数据库字符时他会这样。
这称为Mojibake。这不是数据库编码问题,而是HTTP编码问题。像你一样设置POST请求字符编码确实是正确的解决方案。
编辑1:在我的JSF过滤器中,我还在
req.setCharacterEncoding("UTF-8");
中添加了doFilter()
。仍然在数据库中我看到了????????????
当连接的两个侧识别其自己的编码时,会出现问号。未被一侧编码覆盖的已发送/检索字符将替换为问号。 ISO-8859-1中没有出现阿拉伯字符,因此它们被问号所取代。这与Mojibake的不同之处在于,在不检查对方使用的编码是否真的支持该角色的情况下发送了字符。你最终会得到错误编码的字符,这些字符本身就是一个难以理解的字符序列。
在这种特殊情况下,JDBC驱动程序本身就知道它默认使用ISO-8859-1将字符传输到DB,而检索到的字符是UTF-8(MySQL JDBC驱动程序看起来不像在DB表编码,即使它在你的情况下被正确设置为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