JS Unicode编码和解码(6种方法)

JavaScript 定义了 6 个全局方法用于 Unicode 字符串的编码和解码,说明如表所示。

JavaScript 编码和解码方法
方法 说明
escape() 使用转义序列替换某些字符来对字符串进行编码
unescape() 对使用 escape() 编码的字符串进行解码
encodeURI() 通过转义某些字符对 URI 进行编码
decodeURI() 对使用 encodeURI() 方法编码的字符串进行解码
encodeURIComponent() 通过某些转义字符对 URI 的组件进行编码
deencodeURIComponent() 对使用 encodeURIComponent() 方法编码的字符串进行解码

escape()和unescape()方法

escape() 方法能够把 ASCII 之外的所有字符转换为 %xx 或 %uxxxx(x表示十六进制的数字)的转义序列。从 \u000 到 \u00ff 的 Unicode 字符由转义序列 %xx 替代,其他所有 Unicode 字符由 %uxxxx 序列替代。

示例1

var s = "JavaScript 中国";
s = escape(s);
console.log(s);  //返回字符串“JavaScript%u4E2D%u56FD”
可以使用该方法对 Cookie 字符串进行编码,以避免与其他约定字符发生冲突,因为 Cookie 包含的标点符号是有限制的。

与 escape() 方法对应,unescape() 方法能够对 escape() 编码的字符串进行解码。

示例2

下面代码使用 unescape() 方法解码被 escape() 方法解码的字符串。
var s = "JavaScript 中国";
s = escape(s);  //Unicode编码
console.log(s);  //返回字符串“JavaScript%u4E2D%u56FD”
s = unescape(s);  //Unicode解码
console.log(s);  //返回字符串“JavaScript 中国”

示例3

这种被解码的代码是不能够直接运行的,同学们可以使用 eval() 方法来执行它。
var s = escape('console/log("JavaScript 中国");');  //编码脚本
var s = unescape(s);  //解码脚本
eval(s);  //执行被解码的脚本

encodeURI() 和 decodeURI() 方法

ECMAScript v3.0 版本推荐使用 encodeURI() 和 encodeURIComponent() 方法代替 escape() 方法,使用 decodeURI() 和 decodeURIComponent() 方法代替 unescape() 方法。

示例4

encodeURI() 方法能够把 URI 字符串进行转移处理。
var s = "JavaScript 中国";
s = encodeURI(s);
console.log(s);  //返回字符串“JavaScript%E4%B8%AD%E5%9B%BD”
encodeURI() 方法与 escape() 方法的编码结果是不同的,但是它们都不会编码 ASCII 字符。

相对而言,encodeURI() 方法更佳安全。它能够将字符转换为 UTF-8 编码字符,然后用十六进制的转义序列(形式为%xx)对生成的 1 字节、2 字节或 4 字节的字符进行编码。

使用 decodeURI() 方法可以对 encodeURI() 方法的结果进行解码。

示例5

下面代码演示了如何对 URL 字符串进行编码和解码操作。
var s = "JavaScript 中国";
s = encodeURI(s);  //URI编码
console.log(s);  //返回字符串“JavaScript%E4%B8%AD%E5%9B%BD”
s = decodeURI(s);  //URI解码
console.log(s);  //返回字符串“JavaScript 中国”

encodeURICompoent() 和 decodeURICompoent()

encodeURICompoent() 与 encodeURI() 方法不同。它们的主要区别在于,encodeURICompoent() 方法假定参数是 URI 的一部分,例如,协议、主机名、路径或查询字符串。因此,它将转义用于分隔 URI 各个部分的标点符号。而 encodeURI() 方法仅把它们视为普通的 ASCII 字符,并没有转换。

示例6

下面代码是 URL 字符串被 encodeURICompoent() 方法编码前后的比较。
var s = "www.xinbaoku.com/navi/search.asp?keyword=URI";
a = encodeURI(s);
console.log(a);
b = encodeURICompoent(s);
console.log(b);
输出显示为:
www.xinbaoku.com/navi/search.asp?keyword=URI
www.xinbaoku.com%2Fnavi%2Fsearch.asp%3Fkeyword%3DURI

第一行字符串是 encodeURI() 方法编码的结果,第二行字符串是 encodeURICompoent() 方法编码的结果。与 encodeURI() 方法一样,encodeURICompoent() 方法对于 ASCII 字符不编码,用于 分隔 URI 各种组件的标点符号,都由一个或多个十六进制的转义序列替换。

使用 decodeURICompoent() 方法可以对 encodeURICompoent() 方法编码的结果进行解码。
var s = "www.xinbaoku.com/navi/search.asp?keyword=URI";
b = encodeURICompoent(s);
b = decodeURICompoent(b);
console.log(b);