Javascript 为什么decodeURI解码的字符比它应该解码的多?
我刚刚读了一篇关于decodeURI(,)的文章,有一件事引起了我的注意: encodeURI不可能引入的转义序列不会被替换 因此,它应该只对Javascript 为什么decodeURI解码的字符比它应该解码的多?,javascript,urlencode,Javascript,Urlencode,我刚刚读了一篇关于decodeURI(,)的文章,有一件事引起了我的注意: encodeURI不可能引入的转义序列不会被替换 因此,它应该只对encodeURI编码的字符进行解码 //所有这些都不应该由'encodeURI'转义。 const unescaped=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzo123456789-!~*”()/?:@&=+$,#”; 常量数据=[…未扫描].map(字符=>({ “char”:char,
encodeURI
编码的字符进行解码
//所有这些都不应该由'encodeURI'转义。
const unescaped=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzo123456789-!~*”()/?:@&=+$,#”;
常量数据=[…未扫描].map(字符=>({
“char”:char,
“encodeURI(char)”:encodeURI(char),
“encodePercent(char)”:encodePercent(char),
“decodeURI(encodePercent(char))”:decodeURI(encodePercent(char))
}));
控制台.表格(数据);
log(“检查浏览器的控制台”);
函数编码百分比(字符串){
返回字符串.replace(//g,char=>“%”+char.charCodeAt(0.toString(16));
}
本规范规定了以下步骤:
; / ? : @ & = + $ ,
然后执行以下步骤:
;/?:@&=+$代码>
这意味着,encodeURI
永远不能为uriReserved和uriUnescaped中的任何内容引入转义序列
有趣的是,decodeURI
的定义如下:
设reservedURISet是一个字符串,其中包含在uriReserved plus“#”中有效的每个代码单元的一个实例
返回解码(uriString、reservedURISet)
工作原理类似于编码和解码除reservedURISet中的字符外的所有内容。显然,只有保留的字符被排除在解码之外。而这些恰好是;/?:@&=+$代码>
问题仍然是为什么该标准规定了这一点。如果他们将uriUnescaped包括在reservedURISet中,那么其行为将完全符合引言中所述。可能是错误?规范说明了以下步骤:
让unescapedURISet是一个字符串,其中包含在uriReserved和UriUneScape plus中有效的每个代码单元的一个实例“#”
让我们看看,瞧:
乌里保留:::其中一个
; / ? : @ & = + $ ,
然后执行以下步骤:
返回编码(uriString,unescapedURISet)
中的所有内容都对字符串进行编码,但unescapedURISet中的字符除外,其中包括;/?:@&=+$代码>
这意味着,encodeURI
永远不能为uriReserved和uriUnescaped中的任何内容引入转义序列
有趣的是,decodeURI
的定义如下:
设reservedURISet是一个字符串,其中包含在uriReserved plus“#”中有效的每个代码单元的一个实例
返回解码(uriString、reservedURISet)
工作原理类似于编码和解码除reservedURISet中的字符外的所有内容。显然,只有保留的字符被排除在解码之外。而这些恰好是;/?:@&=+$代码>
问题仍然是为什么该标准规定了这一点。如果他们将uriUnescaped包括在reservedURISet中,那么其行为将完全符合引言中所述。可能是个错误?但是它怎么能介绍其余的角色呢?例如,A
?@更改了,我更新了我的答案。从技术上讲,它现在应该能回答你的问题,但我不知道他们为什么这样定义。如果没有人能解释为什么会这样,我会接受你的回答。但它如何能介绍其余的角色呢?例如,A
?@更改了,我更新了我的答案。从技术上讲,它现在应该能回答你的问题,但我不知道他们为什么这样定义它。如果没有人能解释为什么,我会接受你的答案。