我们公司网站以前开发时候有一个过滤器,负责处理请求编码。
全部都处理成GB2312了。可我后面加了一些功能,有一个表单提交后,我在action里面用form取中文的时候就成乱码了。
原因是过滤器把request的编码设置成GB2312了,我把过滤器改成utf-8就好了。
但现在是如何不改变过滤器就能解决乱码问题?
全部都处理成GB2312了。可我后面加了一些功能,有一个表单提交后,我在action里面用form取中文的时候就成乱码了。
原因是过滤器把request的编码设置成GB2312了,我把过滤器改成utf-8就好了。
但现在是如何不改变过滤器就能解决乱码问题?
就像这样sp初步页面传递中的中文乱码处理非常简单的传递过程
<form action="test.jsp">
username : <input type="text" name="username" />
<br />
<input type="submit">
</form>
也就是输入框传值.
test.jsp中主要代码为:
Hello <%=request.getParameter("username")%>
这样不可能出现乱码的因为这里面没出现中文。
如果改成这样:
<form action="test.jsp">
用户名 : <input type="text" name="username" />
<br />
<input type="submit">
</form>
这样就会在这个页面出错用户名那里就会出现乱码。
这里分析下出现乱码的原因:
主要有请求和响应中可能出现的乱码。
所谓响应中的乱码,就是显示页面上的乱码,因为页面数据是从服务器一端放入响应(response)中,然后发
送给浏览器,如果响应中的数据无法被正常解析,就会出现乱码问题。
为什么英文就没有问题呢?因为在iso-8859-1,gb2312, utf-8以及任意一种编码格式下,英文编码格式都
是一样的,每个字符占8位,而中文就麻烦了,在gb2312下一个中文占16位,两字节,而在utf- 8下一个中
文要占24位,三字节。浏览器在不知道确定编码方式的情况下,就会把这些字符从中间截断,再显示的时
候就乱掉了。所以,想要解决乱码问题,就是要告诉浏览器我们到底使用了什么样的编码方式。
解决方法:
#因为服务器要先从本地读取jsp文件,然后经过处理后写入响应,所以我们首先要知道的就是jsp文件的编
码格式。从问题的源头着手解决。在咱们用的windowxp下,文件默认的编码格式是gb2312。
#我们要在http的响应(response)中添加编码信息,使用如下方式:
<%@ page contentType="text/html; charset=gb2312"%>
#我们还需要在html中指定编码格式。
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>title</title>
</head>
meta部分用来指定当前html的编码格式,注意这一段要放在head标签中,并且放到head标签的最前面,如果
不是最前面ie下可能会出现问题,尤其是在title中有中文的情况下。
**在完成了以上三个#好面的检验设置后,基本上能保证得到正确的中文显示了。
下面传到另外的页面也会产生乱码:我们的表单也就是form传递会有两种方式POST和GET,默认方式GET
在POST方式下面只要在接受的jsp页面上设置请求的字符编码就可以了如下:
<%
request.setCharacterEncoding("gb2312");
%>
但是在 GET方式下面就不管用了上面的方法,这样我们只有对每个中文进行转换了,使用new String
(bytes, "gb2312")进行转码。如下方式:
<%
String username = request.getParameter("username");
byte[] bytes = username.getBytes("iso-8859-1");
String result = new String(bytes, "gb2312");
out.print(result);
%>
这样处理过程就是,先从request中获得参数,接着把字符串按照iso-8859-1编码打散成byte数组,然后
用gb2312编码组合成新字符串,最后打印出来就是正常的中文了。 **也可以写成一串如下:
<%=new String(new String(request.getParameter("username").getBytes("iso-8859-1"), "gb2312")%>
所以我们尽量设置传递的方式为POST这样就可以很简单的解决中文乱码问题。
经过过滤器一转request的编码就成gb2312了。
这样接到的东西肯定是乱码,但如何不修改过滤器就解决乱码问题