在回答另一个问题时,我意识到我的Javascript/DOM知识已经过时了,因为我仍在使用escape/unescape对URL组件的内容进行编码,而现在看来我应该使用encodeURIComponent/decodeURIComponent代替。

我想知道escape/unescape有什么问题吗?有一些模糊的建议,认为围绕Unicode字符存在某种问题,但我找不到明确的解释。

我的网络体验颇有偏见,几乎所有内容都在编写与Internet Explorer绑定(bind)的大型Intranet应用程序。这涉及到escape/unescape的大量使用,并且涉及的应用程序多年来已经完全支持Unicode。

那么escape/unescape应该具有哪些Unicode问题?有人有测试用例来证明问题吗?

最佳答案



它们并不是“错误的”,它们只是它们自己的特殊字符串格式,看起来有点像URI参数编码,但实际上不是。特别是:

  • “+”表示加号,而不是空格
  • 有一种特殊的“%uNNNN”格式用于编码Unicode UTF-16代码点,而不是对UTF-8字节进行编码

  • 因此,如果使用escape()创建URI参数值,则对于包含加号或任何非ASCII字符的字符串,您将得到错误的结果。

    escape()可用作内部纯JavaScript编码方案,例如,以转义cookie值。但是,既然所有浏览器都支持encodeURIComponent(本来就不是这种情况),则没有理由优先使用转义。

    我知道转义/转义只有一种现代用途,这是通过利用URIComponent处理中的UTF-8处理来实现UTF-8编码器/解码器的快速方法:
    utf8bytes= unescape(encodeURIComponent(unicodecharacters));
    unicodecharacters= decodeURIComponent(escape(utf8bytes));
    

    09-11 19:46