Подтвердить что ты не робот

Можно ли закодировать код 36 с помощью JavaScript/jQuery?

Я думаю об использовании здесь метода кодирования/декодирования (кодирование с базой 36/декодирование из базы 36 в Ruby прост)

как реализовать короткий URL-адрес, например URL-адрес в твиттере?

Идея заключается в отслеживании пользовательских рефералов, приглашении URL-адресов. Я могу использовать Rails для декодирования, но там есть способ кодирования с помощью Javascript или jQuery?

4b9b3361

Ответ 1

Метод toString для Number имеет необязательный аргумент radix:

(128482).toString(36);
128482..toString(36);
128482 .toString(36);
var num = 128482; num.toString(36);

Обратите внимание, что это не работает, потому что числа ожидают десятичные цифры после точки, а не буквы:

128482.toString(36);  // Syntax error

Также вы можете декодировать с помощью JS:

parseInt("2r4y", 36);

РЕДАКТИРОВАТЬ:

Но если я хочу удалить похожие символы (1-l или 0-O), что я могу сделать?

Самый простой - уменьшить основание на количество пропускаемых символов, а затем выполнить перевод: обратите внимание, что проблема заключается только в одном из 1-l или 0-O, поскольку base36 кодирует только нижний регистр (в этом случае у вас есть 1-l, но не 0-O), который вы можете сделать заглавными (в этом случае, наоборот).

(128482).toString(36).replace(/[m-y]/, x => String.fromCharCode(x.charCodeAt(0) + 1))

Если вы хотите, чтобы база была больше 36, вам понадобится ваша собственная функция смены базы, так как 36 настолько высока, насколько поддерживает toString. В этом случае достаточно легко сделать свой собственный инвентарь цифр, как вы хотите.

для работы с длинными номерами?

Продолжайте :) Обратите внимание на суффикс n который превращает число в BigInt:

1000000000000000000000000000000000000000000000000000000000n.toString(36)
// => "9edwccv83mch429oxmlxupo4z1bdaiusrm29s"

Ответ 2

Для тех, кто ищет, как закодировать строку в base36 (так как этот вопрос, Как преобразовать строку в base36 в javascript, перенаправляется сюда) -

Вот что я придумал.

/* 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 [email protected]#$%^&*()-_=+[{]};:',<.>/?`~";
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 = "[email protected]#$%^&*()-_=+[{]};:',<.>/?`~";
myNum = parseInt(myString, 36);
console.log(myNum.toString(36))

/* 
Outputs:

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

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

some
foobarw000w
aazz09
*/

Ответ 3

Для тех, кто хочет расшифровать ответ @imjosh в python (скажем, если вы закодировали на стороне клиента и вам нужно декодировать на стороне сервера), это то, что я использовал. Я бы оставил как комментарий в ответе @imjosh, но комментарии не очень хорошо отформатированы.

def decodeBase36(str):
  decoded_str = ""
  for i in range(0, len(str), 2):
    char = chr(int(str[i:i+2], 36))
    decoded_str += char
  return decoded_str

и не столь элегантная версия Objective-C:

+ (NSString *)b36DecodeString:(NSString *)b36String
{
    NSMutableString *decodedString = [NSMutableString stringWithFormat:@""];
    for (int i = 0; i < [b36String length]; i+=2) {
        NSString *b36Char = [b36String substringWithRange:NSMakeRange(i, 2)];
        int asciiCode = 0;
        for (int j = 0; j < 2; j++) {
            int v = [b36Char characterAtIndex:j];
            asciiCode += ((v < 65) ? (v - 48) : (v - 97 + 10)) * (int)pow(36, 1 - j);
        }
        [decodedString appendString:[NSString stringWithFormat:@"%c", asciiCode]];
    }
    return decodedString;
}