首先,把mysql所有编码方式改为utf-8,步骤如下:
$ sudo gedit /etc/mysql/my.cnf
分别在[client],[mysqld],[mysql]找到以下三行,全改为utf8
default-character-set =utf8
改完后要重启mysql.
然后查看mysql编码情况
mysql -u root -p //进入MYSQL
mysql> SHOW VARIABLES LIKE 'character_set_%';
如果结果如下,则正确
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
网页方面:
设置JSP的
pageEncoding=GB2312
contentType=utf-8
即:
<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<%@ page contentType="text/html;charset=UTF-8" %>
相关参考:
解决通过form提交的数据中的乱码
1、通过form提交的数据通常是ISO-8859-1编码的(不知道浏览器上有没有相关设置),因此jsp在从request中获取信息之后要进行内码转换。
String tmp = request.getParameter("sql");
String sqlcmd;
if ( tmp != null ){
sqlcmd = new String(tmp.getBytes("ISO-8859-1"),"UTF-8");
}
else{
sqlcmd = "";
}
首先,我们先了解一下JSP的编码规则,从中可以理解到contentType和pageEncoding的作用域.
contentType的charset是指服务器发送给客户端时的内容编码.而pageEncoding是jsp文件本身的编码.
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。
第一阶段是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就发挥了功效
contentType的設定.
pageEncoding 和contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. 而pageEncoding不等于contentType, 更有利亚洲区的文字 CJKV系JSP网页的开发和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。
从此我们可以看出, pageEncoding影响的是JSP编绎成.java文件(即servlet文件)阶段,此时如果pageEncoding设定错了,用一般的编绎器编绎出来的.java文件中就会出现中文乱码. 而用eclipse的话会提示你编码错误..
而contentType影响的是最后一个阶段,即由Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码(也就是.class文件)的阶段, 我们在客户端看到的结果就是此阶段产生的, 这时的编码就是根据contentType来设定. 光从客户端来说,pageEncoding 和contentType设置的不一样,例pageEncoding=GB2312,contentType的charset=UTF-8,此时客户端显示的JSP页面都能够正常显示中文乱码.