jsp编码

来源:互联网 发布:php企业站 编辑:程序博客网 时间:2024/06/03 23:05

刚毕业做web开发时经常遇到乱码问题,今天就来彻底了断吧。

首先在java中内存中都是unicode编码的,只有传输和输出时才需要编码,而读到内存中时需要解码。

<%@ page language="java" encoding="XXX" contentType="text/html; charset=YYY" %>

其中encoding是保存jsp页面时的编码方式,jsp页面的编码是encoding设置的值。(用记事本可以查看文件的编码)

当用户请求页面时,jsp首先转化为name_jsp.java,再编译为字节码文件index_jsp.class(这两个文件存在于tomcate的work目录下面)。我发现name_jsp.java始终都是utf-8编码。

然后容器将内容通过网络返回给用户,在用户的浏览器上显示,网络传输和显示都是需要编码的,这个编码和contentType中一致。(浏览器的编码也可以查看)


总结一下:
1、没有参数的简单的请求一个页面的情况:
一个jsp页面,编写好后保存(encoding),用户请求这个页面,容器读取(encoding),翻译为_jsp.java文件(始终是utf-8编码),编译为_jsp.class字节码文件(始终是utf-8编码),通过网络传输(contentType),显示到用户的浏览器上(contentType)。还可以通过response设置响应的编码。


2、如果以get方式请求页面,参数会跟着url后面,根据contentType编码后以%xy方式传输。服务器端可以通过如下方式获取正确的参数:

String rawParam = request.getParameter("param");byte[] rawBytes = rawParam.getBytes("iso-8859-1");String param = new String(rawBytes, "XXX");

这里的XXX和发送请求的页面编码一致,也就是和上一个页面的contentType一致。

也可以设置Tomcate的server.xml文件:

<Connector port="8080" protocol="HTTP/1.1"               connectionTimeout="20000"               redirectPort="8443" URIEncoding="XXX" />

添加URIEncoding,就会由容器自动根据这个编码解码了。


3、如果以post方式请求页面,参数包含在请求头里,编码方式也是表单页面的编码,也就是页面的contentType值。可以通过下面的方式获取正确的值:

String rawParam = request.getParameter("param");byte[] rawBytes = rawParam.getBytes("iso-8859-1");String param = new String(rawBytes, "XXX");

也可以通过下面的设置:

request.setCharacterEncoding("XXX");

参考:
http://blog.csdn.net/rat9912345/article/details/5175650
http://blog.sina.com.cn/s/blog_60df85d50100q38c.html

0 0