簡體   English   中英

JavaScript中轉義(字符串)的替代方法

[英]Alternatives to escape(string) in JavaScript

當更改為TypeScript時,因為已棄用 ,所以不再允許使用escape(string)。 我仍然使用它的原因是因為替代方法encodeURI和encodeURIComponent給出了不同的結果。

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

我不是將其用於URL,而是用於CSV導出。

其他選擇是否會給我提供與使用escape(string)相同的結果?

EcmaScript規范中,有以下算法:

  1. 調用ToString(string)。
  2. 計算Result(1)中的字符數。
  3. 令R為空字符串。
  4. 令k為0。
  5. 如果k等於Result(2),則返回R。
  6. 獲取Result(1)中位置k處的字符。
  7. 如果Result(6)是69個非空ASCII字符ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 @ * _ +-。/之一,請轉到步驟14。
  8. 計算16位無符號整數,它是Result(6)的Unicode字符編碼。
  9. 如果Result(8)小於256,請轉到步驟12。
  10. 令S為包含六個字符“%uwxyz”的字符串,其中wxyz是編碼Result(8)值的四個十六進制數字。
  11. 轉到步驟15。
  12. 令S為包含三個字符“%xy”的字符串,其中xy是編碼Result(8)值的兩個十六進制數字。
  13. 轉到步驟15。
  14. 令S為包含單個字符Result(6)的字符串。
  15. 令R為通過串聯R和S的先前值而計算出的新字符串值。
  16. 將k增加1。
  17. 轉到步驟5。

可以這樣編碼:

(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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM