关键是,如果您使用 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"