源码解析Servlet

web开发中乱码问题的解决

2017-12-20  本文已影响13人  ferdinand_hx

web开发中乱码问题的解决

由于楼主刚刚接触web不久,自然而然的就遇到了乱码问题。下面就记录一下乱码问题的解决。

  1. 表单的提交分为GET和POST两种请求方式。两种方式的乱码解决又不一样,用post提交请求时,只需要在接受的时候加上request.setCharacterEncoding("utf-8"); 而GET的请求方法在处理时,应该将接收过来的值打碎成 ISO-8859-1编码,然后再组装成utf-8:new String(request.getParameter(param).getBytes("iso-8859-1"),"UTF-8");
  1. 过滤器的乱码处理问题

如果每次接收都像上面那样去处理的话肯定是太麻烦了,用过滤器来处理请求的乱码问题很方便,只需要写一个过滤器,就可以过滤所有请求页面的乱码问题了。至于如何用过滤器处理乱码请参考用过滤器来解决JSP中的乱码问题。不过值得注意的是,如果使用Struts的话,在web.xml里面处理编码的过滤器必须在struts过滤器前面注册,否则所有页面都不会经过过滤器。

  1. 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:以上几条是摘自网上的。我暂时还没遇到。

  1. 在我的项目中,遇到的问题是发送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按照以上的方式做同样的修改.

然而经过了以上的设置之后,博主的乱码问题依然没有解决,如下图所示:

乱码

在建立一条新数据之后,显示出来的是一串的????。好吧,这时候自然而然的想到了数据库的编码问题了。于是,

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-servercharacter-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)
// 经过一番折腾之后,修改完毕,重启数据库,再运行一下项目,发现添加数据再也没有乱码了。

当然,除此之外,还有一些乱码的问题,例如浏览器的默认编码啊什么的。这些直接设置一下浏览器的编码就行了。还有许多我暂时还没接触到的。

上一篇下一篇

猜你喜欢

热点阅读