Skip to content
Advertisement

Alternatives to escape(string) in JavaScript

When changing to TypeScript I’m not allowed to use escape(string) anymore because it’s deprecated. The reason I still use it is that the alternatives encodeURI and encodeURIComponent give a different results.

var s = "Å"
console.log(escape(s));
console.log(encodeURI(s));
console.log(encodeURIComponent(s));

I don’t use this for URLs, but for a CSV export.

What are other alternatives that will give me the same result as escape(string)?

Advertisement

Answer

In EcmaScript spec there is algorithm:

  1. Call ToString(string).
  2. Compute the number of characters in Result(1).
  3. Let R be the empty string.
  4. Let k be 0.
  5. If k equals Result(2), return R.
  6. Get the character at position k within Result(1).
  7. If Result(6) is one of the 69 nonblank ASCII characters ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 @*_+-./, go to step 14.
  8. Compute the 16-bit unsigned integer that is the Unicode character encoding of Result(6).
  9. If Result(8), is less than 256, go to step 12.
  10. Let S be a string containing six characters “%uwxyz” where wxyz are four hexadecimal digits encoding the value of Result(8).
  11. Go to step 15.
  12. Let S be a string containing three characters “%xy” where xy are two hexadecimal digits encoding the value of Result(8).
  13. Go to step 15.
  14. Let S be a string containing the single character Result(6).
  15. Let R be a new string value computed by concatenating the previous value of R and S.
  16. Increase k by 1.
  17. Go to step 5.

which can be coded like this:

(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);
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement