Java Web--深入分析中文编码问题

本篇主要对javaweb请求响应编码问题的分析.服务器以Tomcat来作说明.
一.请求
1.GET请求
|<————————–URL——————————>|
………………………………..|<—————URI————>|
Http://localhost:8080/demo/servlets/servlet/路径?name=我爱java
…………………………………………..|ServletPath||PathInfo||..QueryString..|
浏览器端编码URL是将非ASCII字符按照某种编码格式编码成16进制数字后将每个16进制表示的字节前加上’%’.
浏览器对PathInfo和QueryString的编码是不一样的,不同浏览器对PathInfo的编码也可能不一样.那么,Tomcat在对URL解码时是怎么对应的呢?
Tomcat对URL的URI部分进行解码的字符集是在

<Connector URIEncoding="UTF-8"/>

中定义的,如果没有定义,那么将以默认编码ISO-8859-1解析.所以有中文URL是最好把URIEncoding设置为UTF-8.
GET请求中,QueryString本身是通过HTTP的Header传到服务端的,Tomcat对其进行解码字符集要么是Header中ContentType定义的Charset,要么是默认的ISO-8859-1,要使用ContentType中定义的编码,就要将connector的useBodyEncodingForURI设置为true.
注意:它并不是对整个URI都采用BodyEncoding进行编码,而仅仅是对QueryString使用BodyEncoding解码.

<Connector URIEncoding="UTF-8" useBodyEncodingForURI="true"/>

所以,在服务器端设置中的URIEncoding和useBodyEncodingForURI两个参数,就可以解决GET请求中乱码的问题.
2.POST请求
POST表单的参数是通过HTTP的BODY传递到服务端的.当我们在页面上单击提交按钮时,浏览器首先将根据ContentType的Charset编码格式对在表单中填入的参数进行编码,然后提交到服务器端,在服务器端会按照系统默认的编码方式解析,所以在获取表单参数的时候需要对这个字符集编码进行设置,可以通过

request.setCharacterEncoding(charset);

来设置字符集.
注意:一定要在第一次调用request.getParameter方法之前就设置request.setCharactreEncoding(charset),否则POST表单提交上来的数据也有可能出现乱码.
另外,针对multipart/form-data类型的参数,也就是上传的文件编码,同样也是使用ContentType定义的字符集编码.需要注意的是,上传文件是用字节流的方式传输到服务器的本地临时目录,这个过程并没有涉及字符编码,而真正的编码是在将文件内容添加到parameters中时,如果用这个不能编码,则将会使用默认编码ISO-8859-1来编码.

二.响应
当用户请求的资源已经成功获取后,这些内容通过Response返回给浏览器,这个过程先经过编码,在到浏览器进行解码.编解码字符集可以通过response.setCharacterEncoding来设置,它会覆盖request.getCharacterEncoding的值,并且通过Header的ContentType返回客户端.浏览器接收到返回的Socket流时通过ContentType的charset来解码.
如果返回的HTTP Header中ContentType没有设置charset,那么浏览器将根据HTML的
中的charset来解码.如果也没有定义,那么浏览器将使用默认的编码来解码.

三.在JS中的编码问题
1.外部引入js文件

<script src="scripts/script.js" charset="utf-8"/>

这时如果script没有设置charset,浏览器会以当前页面的默认字符集解析这个js文件.
2.js的URL编码
通过js发起异步调用的URL默认编码也是受浏览器的影响.
实际上,在js中处理URL编码的函数有三个,只要掌握这三个函数,就可以处理js的URL乱码问题了.
1encodeURI()
它可以将整个URL中的字符进行UTF-8编码,在每个码值前加上’%’.解码通过decodeUTI函数.
2.encodeURIComponent()
这个函数通常用于将一个URL当做参数放在另一个URL中.因为后面URL中的”&”会影响前面URL的完整性.

http://localhost:8080/servlet?ref="+encodeURIComponent('http://...')"

解码使用decodeURIComponent().
3.escape()和unescape()以弃用

四.Java与JS编解码的问题
在Java端处理URL编解码有两个类,分别是:java.net.URLEncoder和java.net.URLDecoder.这两个类可以将所有”%”加UTF-8码值用UTF-8解码.

五.其他需要编码的地方
1.XML文件可以通过设置头来制定编码格式

<?xml version="1.0" encoding="utf-8"?>

2.JSP设置编码格式

<%@page contentType="text/html;charset=utf-8"?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值