我在 Chrome 的控制台中输入了以下代码:
decodeURIComponent('a%AFc');
使用 a0xAFc
会导致 URIError 异常(URI 格式不正确)。
我听到了一些关于为什么可能出现这种情况的借口,但我不理解的是为什么?
decodeURIComponent()
函数特别用于解码数据,而不是验证 URI。
我在 Chrome 的控制台中输入了以下代码:
decodeURIComponent('a%AFc');
使用 a0xAFc
会导致 URIError 异常(URI 格式不正确)。
我听到了一些关于为什么可能出现这种情况的借口,但我不理解的是为什么?
decodeURIComponent()
函数特别用于解码数据,而不是验证 URI。
%AF
不是单独的字符,而是Unicode序列的一部分(MACRON - %C2%AF
)。
%AF
不是由 encodeURIComponent
生成的,而是类似于 escape
的东西,因此可以通过 unescape
解码。
您可能需要的是 decodeURIComponent('%C2%AF')
这个可能适用于其他人的情况,也可能不适用,但对我来说是有效的解决方法,所以我想分享一下。我会上传和下载许多文本文件到一个自定义的CMS。
源代码中的'%'符号为我带来了很大的麻烦。
// send to server
content = content.toString().replace(/%/g,'~~pct~~'); // ~~pct~~ <-made up replacement
content = encodeURI(content);
// get back from server / database
content = decodeURI(content);
content = content.toString().replace(/~~pct~~/g,'%'); // globally restore '%'
%
编码为 %25
,而不是编码为 ~~pct~~
。这样,在解码端就无需进行任何操作,decodeURI 将会把 %25
转换回 %
。 - Nathan Reese
encodeURIComponent()
通常是更好的选择,因为它可以与UTF-8一起使用。然而,单独使用0xAF
不是有效的UTF-8编码字符序列。这就是为什么你的代码无法工作的原因。我希望现在更清楚了。 - duriunescape
已被弃用,并且也没有unescapeURI
。 - felixfbecker