在jsp的web开发中,因为涉及到多方面的通信请求,乱码的发生不可避免,在这里为大家总结一部分的页面乱码和数据库乱码的解决方法。乱码的发生根本原因在于编码方式的不同,为什么要编码?这是因为平时我们写的程序属于高级语言,机器不懂,所以需要转换为机器懂的语言,而各国本地语言又不一样,乱码也就是在本地语言显示的是时候出错,所以多种的编码方式,就是有很多种将自己国家语言转化成机器语言(二进制)的一套编码方式。像国内使用的是GBK编码方式,国际编码方式是UTF-8,其实对中文的开发,知道这两个就够了。
再来了解下web开发过程中需要编码转换和通信的地方,见图(博客内的图基本上都是自己画的,不准确地方还望海涵啊)
接下去大概就分三个方面来说明,需要注意的是,编码方式要统一,要么全部都用GBK要么都用UTF-8编码,这里建议使用国际编码UTF-8,下面都是以utf-8为例。
页面显示
页面编码,是jsp或是html显示在浏览器上时候编码,默认的是ISO-8859-1,这里需要设置页面编码:pageEncoding="utf-8"。
大家知道jsp页面内容都是会被翻译成java语言然后进行编译处理的,这个过程中也需要指定其编译时候的编码方式:contentType="text/html" charset="utf-8"。
以上两个编码只要指定一个,另外一个就默认等同。
页面间传递参数信息(一般是form形式)需要指定编码方式:request.setCharacterEncoding("utf-8") 。
还要指出的一点(不常用),如果利用超链接传递中文字符需要强制转换编码(假设传递的是name属性,在接收页面需要设置)String name = request.getParameter("name") ;String newName = new String(name.getBytes("iso-8859-1"),"utf-8") ;
web容器
需要设置tomcat的编码方式:
port="8080"
redirectPort="8443"
connectionTimeout="20000"URIEncoding="UTF-8"/>
数据库
以mysql为例,mysql有六种编码,在登录mysql查看
SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
第一列表示编码名称,第二列表示编码方式,这里为什么默认使用Latin1编码方式呢?有中说法是,latin1编码方式的时候mysql的执行效率最高,具体是不是等各位自己考证了。根据Variable_name大概也能知道分别指的是什么编码,client指输入mysql时候编码,results就是从mysql返回结果的编码,其他具体的就不追求了。如果因为mysql数据库出错了,最方便的解决就是查看是否编码方式没统一,要将所有编码方式都修改成utf-8。
利用set "variable_name"(具体名称) ="UTF8"例如:setcharacter_set_client ="UTF8"这里注意不是“UTF-8”没有“-”的。当然通过修改配置文档也能修改编码,还有在创建数据库的时候指定编码方式等都是可以。