javascript中存在几种对URL字符串进行编码的方法:escape/encodeURI/encodeURIComponent。这几种编码所起的作用各不相同。
escape
采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符 在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。
不会被此方法编码的字符: @ * / +
encodeURI VS encodeURIComponent 方法
背景
encodeURI 和 encodeURIComponent都是ECMA-262标准中定义的函数,兼容这个标准的语言(如JavaScript, ActionScript)都会实现这两个函数。
它们用来对URI (RFC-2396)字符串进行编码的全局函数,但是它们的处理方式和使用场景有所不同. RFC-2396中对于 URI中的字符分类
- 保留字符(reserved characters):这类字符是URI中的保留关键字符,它们用于分割URI中的各个部分。这些字符是:”;“ | ”/“ | ”?“ | ”:“ | ”@“ | ”&“ | ”=“ | ”+“ | ”$“ | ”,”
- Mark字符(mark characters):这类字符在RFC-2396中特别定义,但是没有特别说明用途,可能是和别的RFC标准相关。 这些字符是:”–“ | ”_“ | ”.“ | ”!“ | ”~“ | ”*“ | ”‘“ | ”(“ | ”)”
- 基本字符(alphanum characters):这类字符是URI中的主体部分,它包括所有的大写字母、小写字母和数字
encodeURI
encodeURI: 该函数对传入字符串中的所有非(基本字符、Mark字符和保留字符)进行转义编码(escaping)。所有的需要转义的字符都按照UTF-8编码转化成为一个、两个或者三个字节的十六进制转义字符(%xx)
encodeURIComponent
该函数处理方式和encodeURI只有一个不同点,那就是对于保留字符同样做转义编码
NodeJS 中http模块获取参数时会自动通过decodeURIComponent进行解码
function (paramName) {
if (req.method === "GET") {
return decodeURIComponent(req.query[paramName]);
} else if (req.method === "POST") {
if (typeof req.body === "object") {
return decodeURIComponent(req.body[paramName]);
} else {
return decodeURIComponent(JSON.stringify(req.body)[paramName]);
}
}
}
编码导致的页面乱码
对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在 javascript1.0版本就有。