JavaScript decodeURI(Component) 函数中的错误 URI 异常

47

我在 Chrome 的控制台中输入了以下代码:

decodeURIComponent('a%AFc');

使用 a0xAFc 会导致 URIError 异常(URI 格式不正确)。

我听到了一些关于为什么可能出现这种情况的借口,但我不理解的是为什么

decodeURIComponent() 函数特别用于解码数据,而不是验证 URI。

2个回答

55

%AF不是单独的字符,而是Unicode序列的一部分(MACRON - %C2%AF)。

%AF不是由 encodeURIComponent 生成的,而是类似于 escape 的东西,因此可以通过 unescape 解码。

您可能需要的是 decodeURIComponent('%C2%AF')


3
我尝试解码一大堆加密文本,失败了,并注意到它会在特定字符处停顿,于是我创造了这个解决方法。也许“unescape”是我需要的工具。 - Christian
1
@ChristianSciberras encodeURIComponent()通常是更好的选择,因为它可以与UTF-8一起使用。然而,单独使用0xAF不是有效的UTF-8编码字符序列。这就是为什么你的代码无法工作的原因。我希望现在更清楚了。 - duri
4
如果我需要处理ASCII / iso-8859-1百分号编码的输入怎么办?unescape已被弃用,并且也没有unescapeURI - felixfbecker
像您这样的人应该有一个特别的地方在天堂。您解决了我的问题。谢谢。 - Harsh Patel
escape has been Deprecated :( - Alireza Bagheri

12

这个可能适用于其他人的情况,也可能不适用,但对我来说是有效的解决方法,所以我想分享一下。我会上传和下载许多文本文件到一个自定义的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 '%'

真的很棒的黑客攻击。 - Nikhil sHETH
2
% 编码为 %25,而不是编码为 ~~pct~~。这样,在解码端就无需进行任何操作,decodeURI 将会把 %25 转换回 % - Nathan Reese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接