Jsp字符编码
参考:http://itxinren.blog.hexun.com/49174427_d.html
一个jsp文件如下:
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
servlet text: 中文
</body>
</html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
servlet text: 中文
</body>
</html>
- 其中pageEncoding="utf-8"决定了jsp编译成servlet时所使用的编码,比如“中文”两个字将以utf-8的形式存储。但是如果jsp文本文件本身不是utf-8格式的,那么编译时就已经产生编码不一致的现象,因此无论怎样客户端显示的都是乱码。
-
pageEncoding="utf-8"与contentType="text/html; charset=gb2312"的编码无关,contentType告知浏览器该响应是以那种格式编码的,它是response header的一部分,默认情况下浏览器会直接以这种编码来解析这个来自于服务器端的响应,而不管响应的html是什么内容。响应内容的编码在这时已确定,客户端无法更改,可以变的只能是以何种编码格式去解析。
- META属性content="text/html; charset=utf-8"只是一段html字符串,跟<body>、<script>之类的内容没什么两样,至于浏览器怎么去解读不用去管。正常情况下这个meta的charset应该设置为与contentType一致,避免查看html源代码时的误读。
- 如果服务端使用tomcat,且对URL参数的解析没有做任何特别处理,那么必然会导致中文乱码。因为客户端以Unicode编码传递参数,而tomcat默认使用ISO-8859-1来解析。比如"?para=中文"将会以"?para=%E4%B8%AD%E6%96%87"来传递,而tomcat中使用request.getParameter时却将E4转换成byte型,无法逆转。因此必须修改tomcat的配置。在server.xml中加入<Connector port="8080" ... useBodyEncodingForURI="true">,这样就可以通过显式地在jsp中指定编码类型来解析中文参数,如request.setCharacterEncoding("utf-8"),同时也说明这一句在没有修改tomcat配置的情况下是不起作用的。