JSP+ MySQL中文乱码问题post提交乱码解决方案

写了两个jsp页面index.jsp和mysql_insert.jsp。数据处理流程为:在浏览器(chrome)上访问index.jsp后在其表单上输入数据,提交至mysql_insert.jsp,mysql_insert.jsp首先将接收到的数据按变量存入MySQL的html_db数据库的person_tb中(该表原有部分数据),然后mysql_insert.jsp再拿出该表中所有数据显示在mysql_insert.jsp页面上。

现在发现,当提交的数据中含有中文(比如变量姓名的值为中文)时,mysql_insert.jsp页面上显示新增的那条记录中的相应中文(姓名的值)乱码,其他数据都显示正常,查看数据库,发现也是相应的含有中文的变量值(姓名的值)乱码。乱码情况如下图:
 
index.jsp中第一行有语句:<%@ page contentType="text/html;charset=gb2312"%> ,在浏览器(chrome)中访问此页面时无乱码(主要指中文乱码,英文乱码现象还没遇见过)。(试过将gb2312换成utf-8,访问后中文乱码)
mysql_insert.jsp中第一行有语句:<%@page language="java" pageEncoding="UTF-8"%>,在浏览器中直接访问此页面时无乱码。
mysql_insert.jsp页面的代码如下:


代码如下:

<%@page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<HTML>
<HEAD>
<TITLE>add message into table </TITLE>
</HEAD>
<BODY>
<%
String id=request.getParameter("id"); //从表单获得
String name=request.getParameter("name"); //从表单获得
String sex=request.getParameter("sex"); //从表单获得
String age=request.getParameter("age"); //从表单获得
try
{
/** 连接数据库参数 **/
String driverName = "com.mysql.jdbc.Driver"; //驱动名称
String DBUser = "root"; //mysql用户名
String DBPasswd = "123456"; //mysql密码
String DBName = "html_db"; //数据库名

String connUrl = "jdbc:mysql://localhost/" + DBName + "?user=" + DBUser + "&password=" + DBPasswd;
Class.forName(driverName).newInstance();
Connection conn = DriverManager.getConnection(connUrl);
Statement stmt = conn.createStatement();
stmt.executeQuery("SET NAMES UTF8");
String insert_sql = "insert into person_tb values('" + id + "','" + name + "','" + sex + "','" + age + "')";
String query_sql = "select * from person_tb";

try {
stmt.execute(insert_sql);
}catch(Exception e) {
e.printStackTrace();
}
try {
ResultSet rs = stmt.executeQuery(query_sql);
while(rs.next()) {
%>
ID:<%=rs.getString("id")%> </br>
姓名:<%=rs.getString("name")%> </br>
性别:<%=rs.getString("sex")%> </br>
年龄:<%=rs.getString("age")%> </br> </br>
<%
}
}catch(Exception e) {
e.printStackTrace();
}
//rs.close();
stmt.close();
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>

我的数据库设置的是全部使用UTF-8编码,如下图:
 
我的虚拟目录下的web.xml内容如下:
 
tomcat/conf目录下的server.xml文件的内容如下:


代码如下:

<U><?xml version='1.0' encoding='utf-8'?></U>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>

tomcat/conf目录下web.xml文件的主要内容如下:


代码如下:

<U><?xml version="1.0" encoding="UTF-8"?></U>
<web-app 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"
version="3.0">
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<此处省略了mime-mapping的内容>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

现在我能想到的设置编码的地方也就只有这么多了,其他还有哪里需要设置编码?恳求指导。
哈哈哈,经过我的一番苦苦探索,终于找到乱码的原因了,当然乱码问题也被解决了。师兄对我建议所有编码全部使用UTF-8,因此我也建议读者也这样做,好处很多。
下面我介绍下我的解决过程:
第一步:在我发现有乱码后,我首先想到的就是是不是我在某个地方设置的编码错误导致的,而MysQL里的设置是正确的(my.ini里设置),就是全部设置为utf8。所以MySQL下的设置我不需要修改。
第二步:然后就是tomcat了,这东西要对我提交的数据进行处理,网上有许多人提出需要设置web.xml和server.xml里面的编码,其中主要是在server.xml里添加URIEncoding="UTF-8",具体设置为:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />。在我完成这一步的设置之后再次测试,发现还是乱码。保留这一步的修改,进行下一步。
第三步:再次回到.jsp页面,我试着将所有涉及到编码和字符集的地方都设置为UTF-8(我之前在index.jsp中首行写的是<%@page language="java" contentType="text/html; charset=gb2312" %> ,现在使用dreamweaver打开index.jsp将其修改为charset=utf-8),然后在浏览器直接访问index.jsp发现中文有乱码,于是关闭dreamweaver,使用myeclipse重新打开index.jsp文件,发现代码中的中文就是乱码,果断修改成正确的中文字符,同时保留刚才对charset的修改,即仍然使用charset=utf-8,然后重新在浏览器访问index.jsp,终于中文字符正常显示了。(以后从此告别dreamweaver,害我饶了好多路)然后我在index.jsp页面上输入中文数据并提交,依然是中文乱码。做了这一步的修改后,我的两个.jsp文件的头部均有如下两句:
<%@ page language="java" pageEncoding="utf-8"%>
<%@ page contentType="text/html;charset=utf-8"%>

第四步:我刚才在想,到底是往数据库存数据时导致的乱码还是从数据库取数据时导致的乱码呢?再或者是在提交后传输数据到mysql_insert.jsp页面时导致的乱码?然后我直接在数据库中插入一条含有中文字符的数据,然后在浏览器直接访问mysql_insert.jsp,发现中文字符能正常显示。那就是说,是在存数据,或者传输数据时乱码的了。那么该怎么设置才能不至于传数据、存数据不乱码呢?
第五步:网上找了下,找到如下内容,非常有用:
1、jsp页面的编码方式有两个地方需要设置:


代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page contentType="text/html;charset=utf-8"%>

其中:pageEncoding 指的是jsp文件本身在本地保存时的编码方式。contentType的charset是指服务器发送网页内容给客户端时所使用的编码。
从第一次访问一个jsp页面开始,到这个页面被发送到客户端,这个Jsp页面要经过三次编码转换:
第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效
所以最终的解决方法为:
在jsp页面设置pageEncoding或者contentType的其中一个为支持中文的编码格式(如utf-8,gbk,gb2312)。因为设置一个的话,另一个默认会和它一样。
如果两个都设置的话,必须保证两个都是支持中文编码(不一定要一样)。
最佳建议设置如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page contentType="text/html;charset=utf-8"%>

2、post方式传值乱码:
由于post方式传值是通过request存储的,在另一个页面也是通过request.getParameter(String name)来提取信息,所以这种情况下的乱码主要是因为request存储信息的编码设置导致的。post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。所以使用如下语句即可得到单个正确的中文字符串:String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;
解决方法:
一、在接收页面设置request.setCharacterEncoding("UTF-8")。
二、最好通过过滤器实现每个页面都设置为request.setCharacterEncoding("UTF-8")。
三、在发送数据的页面使用语句指定使用UTF-8格式发送数据。
3、get方式传值乱码:
get方式传值有两种,一种是表单get传值,另一种是url地址传值(实质上这两种方式都是通过url参数的方式传值)。
表单方式get传值:
表单方式get传值的编码过程为,首先浏览器根据页面的charset编码方式对传值进行编码,然后提交至服务器交给tomcat,tomcat对这些信息进行解码时,采用的解码方式是由server.xml文件中的URIEncoding设置决定的,也就是说,当我们使用命令request.getParameter("")获取表单参数值时,得到的字符串,经过了charset的编码和URIEncoding的解码。

由上所知,只要charset的编码和URIEncoding的解码一致,并且支持中文,就能保证没有乱码。
  设置URIEncoding的方法如下:
  方法一:
  修改$TOMCAT/conf/server.xml文件,在HTTP Connector或者AJP Connector的配置加上URIEncoding="UTF-8"


代码如下:

<... maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

 方法二:
  使用useBodyEncodingForURI="true". 这个方法适合你的TOMCAT实例下需要跑多个不同Encoding的程序时。


代码如下:

<... maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" />
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" useBodyEncodingForURI="true" />

在Tomcat配置中,连接器(HTTP Connector)属性中有一个URIEncoding和
  useBodyEncodingForURI属性,这两个属性设置对URL后的附加参数进行URL解码时该如何选择 字符集编码。URIEncoding用于制定URL后的附加参数的字符集编码,useBodyEncodingForURI 则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置,也就是说当 useBodyEncodingForURI属性设置为true时ServletRequest.setCharacterEncoding方法设置的字符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果。(在/%TomCat_Home%/ conf\server.xml文件中找到 <Connector>标记,然后在后面加上useBodyEncodingForURI=true)
  url方式get传值乱码:
  于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至服务器tomcat,所以这个过程为:
  首先,url地址中的中文被从gbk转换成ISO-8859-1,交给tomcat后,又被tomcat根据URLEcoding解码,这种情况,只有把URLEcoding设置为gbk才能在request.getParameter("")时不出现乱码。但是这样就会影响到上面的配置,所以一个好的解决方法是,使用java.net.URLEcoder和URLDecoder对地址中的中文进行手动编码和解码。
  所以一个万全的解决方法为:
  1)所有页面的charset设置为UTF-8。
  2)Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。
  3)添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。
  4)url地址中存在中文参数时,首先对中文参数使用URLEcoder编码为utf-8,然后在request.getParameter("")接收到参数后再使用URLDecoder还原。例如:
  from.jsp页面:


代码如下:

<%String username = "张某某" ;
username = URLEncoder.encode(username,"utf-8");
%>
<a href="to.jsp?param=<%=username %>">转入</a>

to.jsp页面


代码如下:

<%=URLDecoder.decode(request.getParameter("param"),"utf-8")%>

总之 ,乱码的解决方案如下:
  post传值乱码时,在接收端设置request.setCharacterEncoding("UTF-8")
  get传值或者url乱码时,手动设置接收的参数String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;
  由上可见get,post传值在tomcat5中是不一样的.
看完了上面红字部分的内容,我决定在提交数据的页面设置以UTF-8的格式提交数据,而同时在接收数据的页面设置也以UTF-8接收数据,于是我在两个页面的首部都添加了如下语句:
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=utf-8");
%>

然后测试,OK了!没有乱码了!
现在,index.jsp页面的代码如下:


代码如下:

<%@ page language="java" pageEncoding="utf-8"%>
<%@ page contentType="text/html;charset=utf-8"%>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=utf-8");
%>
<html>
<head>
</head>
<body>
<form action="mysql_insert.jsp" method="post">
ID :<input type = "text" name="id" value="0"/>
姓名 :<input type = "text" name="name" value="aaa"/>
性别 :<input type = "text" name="sex" value="female"/>
年龄:<input type = "text" name="age" value="20"/>
</br>
<input type = "submit" value="提交"/>
</form>
</body>
</html>

(0)

相关推荐

  • MySQL中文乱码问题的解决第1/2页

    转自:http://www.phpchina.cn/viewarticle.php?id=1584 下面要写的是一篇非常无聊的东西,充斥了大量各式各样的编码.转换.客户端.服务器端.连接--呃,我自己都不愿意去看它,但想一想,写下来还是有点意义的,原因有四: MySQL 4.1 对多语言的支持有了很大变化 (这导致了问题的出现): 尽管大部分的地方 (包括个人使用和主机提供商),MySQL 3 仍然占主导地位:但 MySQL 4.1 是 MySQL 官方推荐的数据库,已经有主机提供商开始提供并将

  • Mysql中文乱码以及导出为sql语句和Excel问题解决方法[图文]

    一.导出数据. 先说明一下自己的环境:Mac OS X 10.8.3, MySQL Community Server 5.6.10, MySQL Workbench 5.2.47. 我想把本机数据库内的数据迁移到另一台机器上,于是使用Workbench中自带的import/export功能,其实就是调用mysqldump.不幸的是,出现了版本不一致的错误. 错误没治了,最终找到解决方案,可以指定mysql的mysqldump,路径为:/usr/local/mysql/bin/mysqldump,

  • 小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页

    乱码产生原因 mysql字符编码是版本4.1引入的,支持多国语言,而且一些特性已经超过了其他的数据库系统. 我们可以在MySQL Command Line Client 下输入如下命令查看mysql的字符集 mysql> SHOW CHARACTER SET; +----------+-----------------------------+---------------------+--------+ | Charset  | Description                 | De

  • mysql 中文乱码 解决方法集锦

    第一个方法: MySQL 4.1 中文乱码的问题 最近要将 MySQL 4.0 升级到 MySQL 4.1 ,发现了中文乱码的问题,希望以下见解对大家有用. 1. MySQL 4.1 在文字上有很大改进,它有了 Character Set 与 Collation 的慨念. 2. 在 MySQL 4.0 ,一般的程式都会将文字以拉丁文 ( latin) 来储存,就算我们输入中文字,结果仍是放在以拉丁文设置的文字栏里头,这对 MySQL 4.0 与以 MySQL 4.0 为基楚的程式来说,并不会有问

  • Mysql 导入导出csv 中文乱码问题的解决方法

    导入csv: 复制代码 代码如下: load data infile '/test.csv' into table table_name fields terminated by ','  optionally enclosed by '"' escaped by '"' lines terminated by '\r\n' ignore 1 lines; 导csv: 复制代码 代码如下: SELECT * INTO OUTFILE '/test.csv'  FIELDS TERMIN

  • mysql导入导出数据中文乱码解决方法小结

    linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码: 复制代码 代码如下: mysqldump -uroot -p --default-character-set=utf8 dbname tablename > bak.sql 那么导入数据的时候也要使用-

  • Mysql 下中文乱码的问题解决方法总结

    解决Mysql下中文乱码全是问号的问题 又是头疼的中文乱码问题,刚开始我一直用的本地数据库测,这没问题啊,一点问题都没,但我忘记了安卓和web用的是服务器上我搭的数据库,测了一下,果然乱码了. 试了网上不少方法,虽然不知道具体哪个方法给弄好了,就都说一下吧 第一种方法 刚开始先检查MySQL数据库,发现正如网上所说,部分编码是latin1, 是如下的样子: 果断改啊 set character_set_client=utf8; set character_set_connection=utf8;

  • MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. character-set-table:数据库表字符集. 优先级依次增加.所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集. character-set-client:客户

  • 常见php与mysql中文乱码问题解决办法

    乱码问题1:用PHPmyAdmin操作MySQL数据库汉字显示正常,但用PHP网页显示MySQL数据时所有汉字都变成了?号. 症状:用PHPmyAdmin输入汉字正常,但当PHP网页显示MySQL数据时汉字就变成了?号,并且有多少个汉字就有多少个?号. 原因:没有在PHP网页中用代码告诉MySQL该以什么字符集输出汉字. 解决方法: 1.网页文件head设置编码<meta http-equiv="Content-Type" content="text/html; cha

  • 实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法

    一直不用这个phpmyadmin,在本机也是用navicat,总感觉phpmyadmin速度较慢.这回不行了,没有独立主机,只好用人家给的phpmyadmin了. 第一步:本地数据导出sql文件.心想这对于navicat小事一桩.直接在数据库上右键"转储sql"(如图1),哗哗,十几秒的时间导出成功. (图1:navicat下对整个数据库转sql) 用记事本打开一看,傻眼了.中文全是乱码.咋回事呢?搜索了一下,改变什么连接属性啥的.不管用.试着在单张表上,转储sql,嘿,中文正常.但是

  • jsp中文乱码 jsp mysql 乱码的解决方法

    jsp中文乱码 jsp mysql 乱码要servlet里面支持中文的方法: 在dopost或者doget的第一句加上: request.setCharacterEncoding("GB2312"); response.setCharacterEncoding("GB2312"); jsp乱码问题在jsp里面就把 <%@ page contentType="text/html; charset=gb2312" language="

随机推荐