Java Web中的编码问题(3)
(7)HTTP BODY的编解码
当用户请求的资源已经成功获取后,这些内容将通过Response返回给客户端浏览器,这个过程要先经过编码,再到浏览器进行解码。编解码字符集可以通过response.setCharacterEncoding来设置。并且通过Header的Content-type返回客户端,浏览器接收到返回的Socket流时将通过Content-Type的charset来解码。如果返回的HTTP Header中ContentType没有设置charset,那么浏览器将根据HTML的<meta HTTP-evquiv=”Content-Type” content=”text/html; charset=GBK”>中的charset来解码。如果也没有定义,那么浏览器将使用默认的编码来解码。
(8) 在JS中的编码问题。
一、 外部引入JS文件
如果一个单独的js文件中出现中文,在页面引入的时候。如果js文件的编码和页面的编码格式不同,就会出现乱码。
二、 JS的URL编码
通过JS发起异步调用的URL默认编码也是受到浏览器影响的,另外不同的JS框架可能对URL的编码处理也不一样
JS中处理URL编码的函数有3个:
1. escape()
已弃用
2. encodeURL()
它可以将整个URL中的字符(一些特殊字符除外)进行UTF-8编码,在每个码值前加上“%”。
3. encodeURLComponment()
比encodeURL()编码还要彻底。这个函数通常用于将一个URL当做一个参数放在另一个URL中。
4. Java与JS编解码问题
我们知道,在Java端处理URL编解码有两个类,分别是java.net.URLEncoder和java.net.URLDecoder。这两个类可以将所有“%”加UTF-8码值用UTF-8解码,从而得到原始的字符。URLEncoder受保护的字符要少于js中受保护的字符。Java端的URLEncoder和URLDecoder与前端JS对应的是encodeURLComponment和decodeURLComponment。
如果js使用utf-8编码,java使用GBK解码,会出现乱码,可以将url进行两次编码encodeURLComponment(encodeURLComponment(url)),这样java使用gbk就可以取到UTF-8编码的字符串。如果java端需要使用这个字符串,则在用UTF-8解码一次。如果是将这个结果传递到前端,那么这个UTF-8字符串可以直接在全段正常显示。