web开发中乱码问题的解决
由于楼主刚刚接触web不久,自然而然的就遇到了乱码问题。下面就记录一下乱码问题的解决。
- 表单的提交分为GET和POST两种请求方式。两种方式的乱码解决又不一样,用post提交请求时,只需要在接受的时候加上
request.setCharacterEncoding("utf-8");
而GET的请求方法在处理时,应该将接收过来的值打碎成ISO-8859-1
编码,然后再组装成utf-8:new String(request.getParameter(param).getBytes("iso-8859-1"),"UTF-8")
;
- 过滤器的乱码处理问题
如果每次接收都像上面那样去处理的话肯定是太麻烦了,用过滤器来处理请求的乱码问题很方便,只需要写一个过滤器,就可以过滤所有请求页面的乱码问题了。至于如何用过滤器处理乱码请参考用过滤器来解决JSP中的乱码问题。不过值得注意的是,如果使用Struts的话,在web.xml里面处理编码的过滤器必须在struts过滤器前面注册,否则所有页面都不会经过过滤器。
- AJAX请求的乱码问题
如果使用ajax出现了乱码问题这样解决:前端ajax函数的请求的url里面中文参数用两个encodeURI()函数处理,
var url="user.do?p=checkUser&name="+encodingURI(encodingURI(username.value))"
而服务器端则用URLDecoder.decode()
函数去接收,string userName = URLDecoder.decode(request.getParameter("name"),"utf-8")
; 这样就能够解决ajax请求中乱码的问题了。
PS:以上几条是摘自网上的。我暂时还没遇到。
- 在我的项目中,遇到的问题是
发送get请求时出现乱码
,导致这个问题的原因是,我在web.xml
文件中之配置了针对post请求的编码设置,但是tomcat对POST和GET请求的处理方式是不一样的,我们要针对GET请求出现乱码问题的解决,就需要修改tomcat下的server.xml
文件,如下所示:
将原来的配置:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
改为:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>
然而,如果你修改的是tomcat安装目录下的server.xml
文件的话,那么你在eclipse当中运行项目时会发现配置并没有起作用,这是因为eclipse在运行时用的是eclipse当中配置的tomact,所以我们需要打开左侧项目列表server文件夹-->tomcat-->server.xml
按照以上的方式做同样的修改.
- !这里需要注意的是:
配置useBodyEncodingForURI="true"后,可以解决普通get请求的中文乱码问题,但是对于通过ajax发起的get请求中文依然会乱码,请把useBodyEncodingForURI="true"改为URIEncoding="UTF-8"即可
。
然而经过了以上的设置之后,博主的乱码问题依然没有解决,如下图所示:
在建立一条新数据之后,显示出来的是一串的????。好吧,这时候自然而然的想到了数据库的编码问题了。于是,
sudo /ect/init.d/mysql start
mysql> show variables like "%char%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
根据上面的显示我们可以发现character-set-server
和character-set-database
的编码是latin1
,所以,接下来我就要将其修改为utf8了。
// 1. 打开mysql的配置文件,ubuntu下是my.cnf
lucas@lucas-ThinkPad-PC:~$ sudo vim /etc/mysql/my.cnf
// 2. 在配置文件中加入以下一句
character-set-server=utf8 // 自己根据对应的需要修改的在对应的节点下添加。
// 3. 这样问题就解决了。
我是使用命令行进行修改的:
lucas@lucas-ThinkPad-PC:~$ su
root@lucas-ThinkPad-PC:/home/lucas# mysql -u root -p
mysql> set character_set_client=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_connection=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_database=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_results=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_server=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_system=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_connection=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_database=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> set collation_server=utf8;
Query OK, 0 rows affected (0.01 sec)
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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
// 经过一番折腾之后,修改完毕,重启数据库,再运行一下项目,发现添加数据再也没有乱码了。
当然,除此之外,还有一些乱码的问题,例如浏览器的默认编码啊什么的。这些直接设置一下浏览器的编码就行了。还有许多我暂时还没接触到的。