JavaScript 中 escape(string) 的替代方案

Eng*_*ern 2 javascript

当更改为 TypeScript 时,我不再允许使用 escape(string),因为它已被弃用。我仍然使用它的原因是替代方案encodeURI和encodeURIComponent给出了不同的结果。

\n

\r\n
\r\n
var s = "\xc3\x85"\nconsole.log(escape(s));\nconsole.log(encodeURI(s));\nconsole.log(encodeURIComponent(s));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

我不将其用于 URL,而是用于 CSV 导出。

\n

还有哪些其他选择可以给我带来与 相同的结果escape(string)

\n

jcu*_*bic 8

EcmaScript 规范中有一个算法:

\n\n
    \n
  1. 调用 ToString(字符串)。
  2. \n
  3. 计算 Result(1) 中的字符数。
  4. \n
  5. 令 R 为空字符串。
  6. \n
  7. 令 k 为 0。
  8. \n
  9. 如果 k 等于 Result(2),则返回 R。
  10. \n
  11. 获取 Result(1) 中位置 k 处的字符。
  12. \n
  13. 如果 Result(6) 是 69 个非空白 ASCII 字符 ABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz 0123456789 @*_+-./ 之一,请转至步骤 14。
  14. \n
  15. 计算 Result(6) 的 Unicode 字符编码 16 位无符号整数。
  16. \n
  17. 如果 Result(8) 小于 256,则转至步骤 12。
  18. \n
  19. 令 S 为包含六个字符 \xe2\x80\x9c%uwxyz\xe2\x80\x9d 的字符串,其中 wxyz 是编码 Result(8) 值的四个十六进制数字。
  20. \n
  21. 转至步骤 15。
  22. \n
  23. 令 S 为包含三个字符 \xe2\x80\x9c%xy\xe2\x80\x9d 的字符串,其中 xy 是编码 Result(8) 值的两个十六进制数字。
  24. \n
  25. 转至步骤 15。
  26. \n
  27. 令 S 为包含单个字符 Result(6) 的字符串。
  28. \n
  29. 令 R 为通过连接 R 和 S 的先前值计算出的新字符串值。
  30. \n
  31. 将 k 增加 1。
  32. \n
  33. 转到步骤 5。
  34. \n
\n\n

可以这样编码:

\n\n
(function(global) {\n    var allowed = \'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./,\';\n    global.escapeString = function(str) {\n        str = str.toString();\n        var len = str.length, R = \'\', k = 0, S, chr, ord;\n        while(k < len) {\n            chr = str[k];\n            if (allowed.indexOf(chr) != -1) {\n                S = chr;\n            } else {\n                ord = str.charCodeAt(k);\n                if (ord < 256) {\n                    S = \'%\' + ("00" + ord.toString(16)).toUpperCase().slice(-2);\n                } else {\n                    S = \'%u\' + ("0000" + ord.toString(16)).toUpperCase().slice(-4);\n                }\n            }\n            R += S;\n            k++;\n        }\n        return R;\n    };\n\n})(typeof window == \'undefined\' ? global : window);\n
Run Code Online (Sandbox Code Playgroud)\n