您的位置:首页 > Web前端 > JavaScript

JS中的编码问题

2014-01-04 17:27 183 查看
一、外部引入JS文件
如果在一个单独的JS文件中包含字符串输入的情况,如:
<html>
<head>
<script src="../js/script.js" charset="gbk"></script>
引入一个script.js脚本,这个脚本中有如下代码:
document.write("这是一段中文");
这时如果script没有设置charset,浏览器就会以当前这个页面的默认字符集来解析这个JS文件,如果JS文件的编码格式和当前页面的编码格式一致,则可以不用设置charset;如果不一致的话,不设置charset,上面那段中文就会变成乱码。

二、JS的URL编码
通过JS异步调用的URL默认编码也是受浏览器影响的,如使用原始Ajax的http_request.open('GET',url,true)调用,URL的编码在IE下是操作系统的默认编码,而在Firefox下则是UTF-8编码。
实际上JS中处理URL编码有三个函数。
1、escape()
这个函数是将ASCII字母、数字、标点符号(*+-./@_)以外的其他所有字符转化成Unicode编码值,并且在编码值前加上“%u”。解码可以通过unescape()函数。如:
escape("I am 君山");
//结果如下
"I%20am%20%u541B%u5C71"
unescape("I%20am%20%u541B%u5C71");
//结果如下
"I am 君山"
注:escape()和unescape()已经从ECMAScript v3 标准中删除了,URL的编码可以用encodeURI和encodeURIComponent来代替。

2、encodeURI()
与escape()相比,encodeURI()是真正的JS用来对URL编码的函数,它可以将整个URL中的字符(除了一些特殊字符,如!#$&'()*+,-./:;=?@_~0-9a-zA-Z)进行UTF-8编码,在每个码值前加上“%”。
相对的,解码通过decodeURI函数来实现。

3、encodeURIComponent()
encodeURIComponent()这个函数比encodeURI()编码还要彻底,它除了对!'()*-._~0-9a-zA-Z这几个字符不编码外,其他所有字符都编码,这个函数通常用于将一个URL当作一个参数放在另一个URL中。
相对的,解码通过decodeURIComponent()来实现。

4、Java与JS编解码问题
我们知道,Java端处理URL编解码有两个类,java.net.URLEncoder和java.net.URLDecoder。这两个类可以将所有“%”加UTF-8码值用UTF-8解码,从而得到原始字符。
Java端的URLEncoder和URLDecoder与前段JS对应的是encodeURIComponent和decodeURIComponent。
注:如果JS端用encodeURIComponent编码后,Java端用URLDecoder解码可能出现乱码,一定是两个字符编码类型不一致导致的;可以用encodeURIComponent两次编码来解决。

三、其他需要编码的地方
除了URL和参数编码外,在服务端还有很多地方可能存在编码,如可能需要读取XML、Velocity模板引擎、JSP或者数据库等等。
XML设置编码格式:
<?xml version="1.0" encoding="UTF-8">

Velocity模板引擎设置编码格式:
services.VelocityService.input.encoding=UTF-8

JSP设置编码格式:
<%@page contentType="text/html;charset=UTF-8" %>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: