JavaScript 提供了三组用于字符编码与解码的函数:escape 与 unescape、encodeURI 与 decodeURI,以及 encodeURIComponent 与 decodeURIComponent。每组函数适用场景不同,编码范围和处理方式也有所差异。本文将结合实际使用经验,简要说明各组函数的特点及常见用途,帮助理解它们在不同情况下的应用区别。
1、 对于ANSI码0至255范围之外的字符,escape函数会将其转换为%u格式的Unicode编码;而所有空格、标点符号、重音字符及其它非ASCII字符,则统一以%xx的形式表示,其中xx为该字符对应值的十六进制数。例如,空格被编码为%20。
2、 escape不转义的字符共69个,包括:*、+、-、.、/、@、_以及数字0-9和大小写字母a-z。
3、 对应的解码函数是 unescape。
4、 encodeURI 函数主要用于对网页地址栏中的 URI 进行编码处理。该函数首先将传入的参数内容转换为 UTF-8 编码格式,然后对其中不符合 URI 规范的字符进行转义。具体而言,所有非 ASCII 字符以及在 URI 中具有特殊含义的符号,如分号(;)、斜杠(/)、问号(?)、冒号(:)、at 符(@)、与号(&)、等号(=)、加号(+)、美元符(\$)、逗号(,)和井号()等,都会被替换为以百分号开头的 %xx 形式。其中,标准 ASCII 字符仅转为一个 %xx 单元,Unicode 范围在 u0080 至 u07ff 的字符会编码为两个 %xx 组合,而更广泛的 16 位 Unicode 字符则使用三个 %xx 单元表示。值得注意的是,encodeURI 不会对某些安全字符进行编码,共保留 82 个不编码字符,包括英文字母(a-z 和 A-Z)、数字(0-9),以及特定符号:!、、\$、&、、(、)、*、+、,、-、.、/、:、;、=、?、@、_ 和 ~。这些字符在 URI 中被视为合法且可直接传输,因此无需转义。通过这种方式,encodeURI 确保了 URI 的完整性和正确解析。
5、 对应的解码函数是encodeURIComponent。
6、 encodeURIComponent函数主要用于地址栏的编码处理,其编码方式与encodeURI相似,但会对URI中具有特殊含义的字符如分号、斜杠、问号、冒号、at符、与符号、等号、加号、美元符、逗号和井号等进行转义。因此,不被编码的字符仅保留71个,适用范围更广,尤其适用于参数值或路径片段的完整编码场景。
7、 解码函数对应的是decodeURIComponent方法。
8、 根据不同函数的编码特性,处理数据时推荐使用escape,对完整的URL应采用encodeURI,可确保合法字符不被转义;而针对URL的局部部分,特别是包含特殊含义的请求参数,则宜使用encodeURIComponent,以便正确编码相关符号,保障传输的准确性与完整性。
9、 下图展示了Chrome控制台中各函数对字符编码的输出结果。
