JavaScript的encodeURI()函数在编码时会将非URL合法字符转换为UTF-8编码的十六进制表示形式,具体规则如下:
保留字符不编码:包括协议部分(如
://)、查询参数分隔符(?)、路径分隔符(/)等URL元字符不会被编码。例如
:、/、?、#等字符会保持原样输出。编码非保留字符:对非URL合法字符(如空格、中文字符等)会转换为
%后跟两位十六进制数的形式。例如空格编码为%20,汉字“中”编码为%E4%B8%AD(UTF-8编码的十六进制表示)。不编码的字符范围:字母(A-Z/a-z)、数字(0-9)以及
- _ . ! ~ * ' ( )等语义字符不会被编码。
与encodeURIComponent()的区别在于,后者会编码所有非标准字符(包括URL分隔符),而encodeURI()仅编码可能破坏URL结构的非法字符。
例如:
encodeURI("http://example.com/测试")
// 输出 "http://example.com/%E6%B5%8B%E8%AF%95"(仅编码中文)底层实现上,JavaScript引擎(如V8)会通过UTF-8编码处理字符串,将每个非法字符的字节序列转换为%XX形式,但具体编译后的机器码因引擎实现而异。