是否可以使用JavaScript/jQuery进行36编码?

AnA*_*ice 23 javascript jquery

我正在考虑在这里使用编码/解码技术(编码到基础36 /从基础36解码在Ruby中很简单)

如何在twitter中实现像网址一样的简短网址?

想要跟踪用户推荐,邀请URL.我可以使用Rails进行解码,但有没有办法用Javascript或jQuery进行编码?

Ama*_*dan 47

toString方法对Number具有基数的可选参数:

(128482).toString(36);
128482..toString(36);
128482 .toString(36);
var num = 128482; num.toString(36);
Run Code Online (Sandbox Code Playgroud)

请注意这不起作用,因为数字期望一段时间后的十进制数字,而不是字母:

128482.toString(36);  // Syntax error
Run Code Online (Sandbox Code Playgroud)

此外,您还可以使用JS进行解码:

parseInt("2r4y", 36);
Run Code Online (Sandbox Code Playgroud)

  • 至于为什么`128482.toString(36)`不起作用,但是`128482..toString(36)`(注意两个点)确实...... JS喜欢随时搜索数字的第一个点,和`128482.是一个有效的数字文字,即使没有小数点后的任何内容. (8认同)
  • *大于2 ^ 53的数字可能会失去准确性 (2认同)

imj*_*osh 6

对于任何想要如何编码base36中的字符串的人(因为这个问题,如何在javascript中将字符串转换为base36,重定向到此处) -

这就是我想出来的.

/* encode / decode strings to / from base36 

   based on: http://snipplr.com/view/12653/
*/

var base36 = {
    encode: function (str) {
        return Array.prototype.map.call(str, function (c) {
            return c.charCodeAt(0).toString(36);
        }).join("");
    },
    decode: function (str) {
        //assumes one character base36 strings have been zero padded by encodeAscii
        var chunked = [];
        for (var i = 0; i < str.length; i = i + 2) {
            chunked[i] = String.fromCharCode(parseInt(str[i] + str[i + 1], 36));
        }
        return chunked.join("");
    },
    encodeAscii: function (str) {
        return Array.prototype.map.call(str, function (c) {
            var b36 = base36.encode(c, "");
            if (b36.length === 1) {
                b36 = "0" + b36;
            }
            return b36;
        }).join("")
    },
    decodeAscii: function (str) {
        //ignores special characters/seperators if they're included
        return str.replace(/[a-z0-9]{2}/gi, function (s) {
            return base36.decode(s);
        })
    }
};

var foo = "a-Az-Z 0-9 !@#$%^&*()-_=+[{]};:',<.>/?`~";
var bar = base36.encodeAscii(foo);

console.log(foo);
console.log(base36.decode(bar));

console.log('');

var bar = "==/" + bar + "\\==";
console.log(bar)
console.log(base36.decodeAscii(bar));


//doesn't work
console.log('');
var myString = "some string";
var myNum = parseInt(myString, 36);
console.log(myNum.toString(36))

myString = "FooBarW000t";
myNum = parseInt(myString, 36);
console.log(myNum.toString(36))

myString = "aAzZ09!@#$%^&*()-_=+[{]};:',<.>/?`~";
myNum = parseInt(myString, 36);
console.log(myNum.toString(36))

/* 
Outputs:

a-Az-Z 0-9 !@#$%^&*()-_=+[{]};:',<.>/?`~
a-Az-Z 0-9 !@#$%^&*()-_=+[{]};:',<.>/?`~

==/2p191t3e192i0w1c191l0w0x1s0z10112m12161415192n1p172j3f2l3h1n1m13181o1a1q1b1r2o3i\==
==/a-Az-Z 0-9 !@#$%^&*()-_=+[{]};:',<.>/?`~\==

some
foobarw000w
aazz09
*/
Run Code Online (Sandbox Code Playgroud)