为什么unescape工作但是decodeURI不工作?

时间:2016-01-12 22:24:46

标签: javascript

我有以下变量:

var string="Mazatl%E1n";

服务器返回字符串。我想做的就是将其解码为:Mazatlán。我尝试了以下内容:

var string="Mazatl%E1n";

alert(unescape(string));
alert(decodeURI(string));

unescape 工作正常,但我不想使用它,因为我理解它是deprecated,而是我尝试 decodeURI ,但是失败并出现以下错误:

  

未捕获URIError:URI格式错误

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

var string="Mazatl%E1n";

alert(unescape(string));
alert(decodeURI(string));

3 个答案:

答案 0 :(得分:2)

URI支持ASCII字符集,docker commit -m 'changes' -a 'me' "$(docker ps --all -q | head -1)" <image name> 的正确格式编码为á(采用UTF-8编码)

fiddle

escape和unescape使用十六进制转义序列
(这是不同的......);
因此,您从服务器获得的值已使用%C3%A1进行编码。

答案 1 :(得分:2)

您收到错误,因为%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);

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

var string = "Mazatl%C3%A1n"
document.body.innerHTML = decodeURI(string);

答案 2 :(得分:0)

decodeURI()函数需要一个有效的URI作为其参数。如果您只是尝试解码字符串而不是完整URI,请使用decodeURIComponent()