JavaScript

时间:2016-05-18 14:11:49

标签: javascript

当更改为TypeScript时,我不再允许使用转义(字符串),因为它是deprecated。我仍然使用它的原因是因为替代品encodeURI和encodeURIComponent给出了不同的结果。

var s = "Å"
alert(escape(s));
alert(encodeURI(s)) 
alert(encodeURIComponent(s))

我不会将此用于网址,而是用于CSV导出。

其他替代方法会在escape(字符串)中提供相同的结果吗?

1 个答案:

答案 0 :(得分:1)

EcmaScript spec中有算法:

  1. 调用ToString(字符串)。
  2. 计算结果(1)中的字符数。
  3. 设R为空字符串。
  4. 设k为0。
  5. 如果k等于Result(2),则返回R.
  6. 获取结果(1)中位置k的角色。
  7. 如果Result(6)是69个非空白ASCII字符之一ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 @ * _ + - ./,转到第14步。
  8. 计算16位无符号整数,它是Result(6)的Unicode字符编码。
  9. 如果结果(8)小于256,请转到步骤12.
  10. 设S是一个包含六个字符“%uwxyz”的字符串,其中wxyz是四个十六进制数字,用于编码 结果值(8)。
  11. 转到第15步。
  12. 设S为包含三个字符“%xy”的字符串,其中xy是编码的两个十六进制数字 结果值(8)。
  13. 转到第15步。
  14. 设S为包含单个字符Result(6)的字符串。
  15. 设R是通过连接R和S的先前值计算的新字符串值。
  16. 将k增加1。
  17. 转到第5步。
  18. 可以这样编码:

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