如何检测字符串是否使用escape()或encodeURIComponent()进行编码

Rod*_*igo 8 javascript encoding escaping

我有一个Web服务,接收来自不同客户端的数据.其中一些发送使用escape()编码的数据,而其他人使用encodeURIComponent().有没有办法检测用于转义数据的编码?

mik*_*ika 12

这对服务器端没有帮助,但在客户端,我使用了javascript异常来检测url编码是否产生了ISO Latin或UTF8编码.

decodeURIComponent 在无效的UTF8序列上抛出异常.

try {
     result = decodeURIComponent(string);
}
catch (e) {
     result =  unescape(string);                                       
}
Run Code Online (Sandbox Code Playgroud)

例如,ISO Latin编码的变音符号'ä' %E4将在Firefox中引发异常,但UTF8编码的'ä' %C3%A4不会.

也可以看看


Dej*_*vić 10

我意识到这是一个老问题,但我不知道更好的解决方案.所以我这样做(感谢上面RobertPitt的评论):

function isEncoded(str) {
    return typeof str == "string" && decodeURIComponent(str) !== str;
}
Run Code Online (Sandbox Code Playgroud)

我还没有遇到过这种失败的情况.这并不意味着案件不存在.也许有人可以对此有所了解.

  • 当某些内容仅部分编码时(例如“http://google.de/hello%20world woops”),它会失败。仍然需要找到一种优雅的方式来处理这个问题。 (2认同)
  • 该解决方案与尝试确定 escape() 或encodeURIComponent() 中的哪一个已被编码无关。 (2认同)

Der*_*ley 6

鼓励您的客户使用encodeURIComponent().请参阅此页面以获得解释: 比较escape(),encodeURI()和encodeURIComponent().如果你真的想要确切地弄清楚某些东西是如何被编码的,你可以尝试寻找一些escape()和encodeURI()不编码的字符.

  • 也可能是这样的:`function isEncoded(str){return decodeURIComponent(str)!== str;}` (15认同)