天天看点

[error handle][servlet]转发导致的中文乱码

REASON

写了一个表单页面webBasic.jsp,信息提交到Servlet,然后读取数据库信息转发到webBasic.jsp。

ERROR

输出的汉字变为了乱码。连jsp本身的内容,原先正常的也变成了乱码。

主要代码和效果截图如下:

Servlet代码:

[error handle][servlet]转发导致的中文乱码

Jsp代码:

[error handle][servlet]转发导致的中文乱码

提交前界面:

[error handle][servlet]转发导致的中文乱码

提交后界面:

[error handle][servlet]转发导致的中文乱码

FIND

1、html,jsp,三处设置都为”UTF-8”,浏览器编码更改为UTF-8一样会出现乱码。

2、按照视频里的教育,在输出前加上语句request.setCharacterEncoding(“UTF-8”);并没有卵用。

3、按照网上的介绍,做了个过滤器,过滤/*,结果一打开所有页面body里的内容都没了。只好暂时改成/abc,过滤还没学过,还是以后再用吧。

HANDLE

研究转发的原理,我们最后得到的“整个页面”应该就是最后Response的内容。也就是说Response的编码有问题。

在CustomerServlet doGet的第一行加入response.setCharacterEncoding(“utf-8”);页面正常。response.setContentType(“text/html;charset=UTF-8”);也可以。

进一步发现,乱码的关键在于Servlet doGet中一个response.getWriter()语句,如果response.setCharacterEncoding(“utf-8”);在其之后,最后得到的页面就会出现乱码。

下面是这两个语句之间的关系。

1、response.getWriter().append(“aaa”);

response.setCharacterEncoding(“utf-8”);

set语句在之后,出现乱码

2、response.getWriter().append(“aaa”);

无set语句,出现乱码

3、response.setCharacterEncoding(“utf-8”);

response.getWriter().append(“aaa”);

set语句在之前,无乱码

4、两个语句都没有,无乱码。

其中原因为何,尚待研究。

另外据说解决乱码最彻底的方法还是设置一个filter,里面是这三行语句,留下备忘。

request.setCharacterEncoding(“UTF-8”);

response.setCharacterEncoding(“utf-8”);

response.setContentType(“text/html;charset=UTF-8”);

继续阅读