为什么 unescape 有效而 decodeURI 无效?

ang*_*net 6 javascript

我有以下变量:

var string="Mazatl%E1n";
Run Code Online (Sandbox Code Playgroud)

该字符串由服务器返回。我想要做的就是将其解码为:Mazatlán. 我尝试了以下方法:

var string="Mazatl%E1n";

alert(unescape(string));
alert(decodeURI(string));
Run Code Online (Sandbox Code Playgroud)

unescape工作正常,但我不想使用它,因为我知道它已被弃用,而是我尝试了decodeURI ,但失败并出现以下错误:

未捕获的 URIError:URI 格式错误

为什么 ?任何帮助表示赞赏。

var string="Mazatl%E1n";
Run Code Online (Sandbox Code Playgroud)

Joh*_*son 6

您收到错误,因为%E1是 Unicode 编码,但decodeURI()需要 UTF-8。

您要么必须创建自己的 unescape 函数,例如:

function unicodeUnEscape(string) {
  return string.replace(/%u([\dA-Z]{4})|%([\dA-Z]{2})/g, function(_, m1, m2) {
    return String.fromCharCode(parseInt("0x" + (m1 || m2)));
  })
}

var string = "Mazatl%E1n";
document.body.innerHTML = unicodeUnEscape(string);
Run Code Online (Sandbox Code Playgroud)

或者您可以更改服务器以发送以 UTF-8 编码的字符串,在这种情况下,您可以使用 decodeURI()

var string = "Mazatl%C3%A1n"
document.body.innerHTML = decodeURI(string);
Run Code Online (Sandbox Code Playgroud)