19

我只是在用 AJAX 测试一些东西,我发现如果我发出警报就成功了

alert(decodeURI('%'));

或者

alert(encodeURIComponent('%'));

浏览器出现以下代码错误。

$.ajax({
   type: "POST",
   url: "some.php",
   data: "",
   success: function(html){
         alert(decodeURIComponent('%'));
//           alert(decodeURI('%'));
   }
 });

如果我使用任何其他字符串,它就可以正常工作。
是我错过了什么吗?

4

8 回答 8

23

最近decodeURIComponent,我的代码中的一个被 & 号绊倒了%,谷歌搜索让我想到了这个问题。

这是我用来处理的函数,%它比 Ilia 的版本短:

function decodeURIComponentSafe(s) {
    if (!s) {
        return s;
    }
    return decodeURIComponent(s.replace(/%(?![0-9][0-9a-fA-F]+)/g, '%25'));
}

  • 如果输入为空,则返回输入值不变
  • 将每个%NOT 后跟一个两位数(十六进制)数字替换为%25
  • 返回解码后的字符串

它也适用于此处的其他示例:

  • decodeURIComponentSafe("%%20Visitors") // % Visitors
  • decodeURIComponentSafe("%Directory%20Name%") // %Directory Name%
  • decodeURIComponentSafe("%") // %
  • decodeURIComponentSafe("%1") // %1
  • decodeURIComponentSafe("%3F") // ?
于 2019-01-22T14:08:43.687 回答
18

从控制台尝试时 Chrome barfs。它给出了一个 URIError: URI malformed。% 是一个转义字符,它不能单独存在。

于 2011-09-16T19:46:33.300 回答
9

关键是,如果您使用 single%它会破坏decodeURIComponent()函数的逻辑,因为它期望紧随其后的两位数数据值,例如%20(空格)。

周围有一个黑客。我们需要首先检查是否decodeURIComponent()可以在给定的字符串上运行,如果不能按原样返回字符串。

例子:

function decodeURIComponentSafe(uri, mod) {
    var out = new String(),
        arr,
        i = 0,
        l,
        x;
    typeof mod === "undefined" ? mod = 0 : 0;
    arr = uri.split(/(%(?:d0|d1)%.{2})/);
    for (l = arr.length; i < l; i++) {
        try {
            x = decodeURIComponent(arr[i]);
        } catch (e) {
            x = mod ? arr[i].replace(/%(?!\d+)/g, '%25') : arr[i];
        }
        out += x;
    }
    return out;
}

跑步:

decodeURIComponent("%Directory%20Name%")

会导致Uncaught URIError: URI malformed错误

尽管:

decodeURIComponentSafe("%Directory%20Name%") // %Directory%20Name%

将返回初始字符串。

如果您希望拥有一个固定/正确的 URI 并%变成%25您必须将其1作为附加参数传递给自定义函数:

decodeURIComponentSafe("%Directory%20Name%", 1) // "%25Directory%20Name%25"
于 2017-04-15T11:53:49.403 回答
3

这里的问题是您正在尝试解码%. 这不是有效的编码字符串。我想你想编码%

decodeURI('%') // URIError
encodeURI('%') // '%25'
于 2011-09-16T20:00:48.607 回答
2

不幸的是,这里的一些答案无法满足我的代码,所以我做了一个替代解决方案。如果有人遇到同样的问题。

您可以使用 try...catch 块进行安全解码。如果字符串是可解码的,它将解码,如果不是,它返回与已解码相同的字符串。

function decodeURIComponentSafely(uri) {
    try {
        return decodeURIComponent(uri)
    } catch(e) {
        console.log('URI Component not decodable: ' + uri)
        return uri
    }
}
于 2021-06-09T14:09:14.783 回答
1

两者decodeURI('%')decodeURIcomponent('%')不能工作,因为 URL 格式错误(单个 % 作为 url 或 url 组件无效)

Uncaught URIError: URI malformed

encodeURIComponent()作品

于 2011-09-16T19:45:05.500 回答
0

我和 OP 有同样的问题,发现这个有用的话题。在使用 decodeURIComponent() 之前,必须找到一种方法来检查 URI 字符串是否包含百分号。

来自Ilia Rostovtsev的这段代码效果很好,除了 URI 包含编码字符,如 %C3(其中百分号以 [AF] 开头),因为使用的正则表达式不处理它们(只有 % 后跟小数)。

我替换了以下行:

   x = mod ? arr[i].replace(/%(?!\d+)/g, '%25') : arr[i];

经过

   x = mod ? arr[i].replace(/%(?!\d|[ABCDEF]+)/g, '%25') : arr[i];

现在,它正在工作,因为正则表达式将拒绝 %1A 到 %9F 以及 %A1 到 %F9

于 2020-05-29T07:49:49.163 回答
-7

无限循环或锁定可能是由于 jquery 中的错误。

您可以在 jquery 中设置一个可能导致“锁定”的断点。

%仅提供解码没有意义,因为percent-encoding后面是指 ASCII 表中给定字符的字母数字,通常应该在 Opera、Chrome、FF 中产生 URIError。

encodeURI如果您正在寻找百分比字符的“url-encoded”表示法,请使用浏览器内置功能:

encodeURI('%')
//>"%25"
于 2011-09-16T19:48:58.017 回答