Кодировать (и декодировать) URL как строку букв - PullRequest
1 голос
/ 26 мая 2011

Мне нужна функция, которая может закодировать любой URL-адрес в строку из всех букв (верхний и нижний регистр), и еще одна функция для декодирования его обратно в URL-адрес.Какой лучший способ сделать это?

Пример API:

> 'http://stackoverflow.com/questions/ask'.url_to_chars
=> 'mgzGBORuRcFSfNXDpDbVgzzvANHLqIEcgjCAXsKbNXGouOckToKkZRBnvE'


> 'mgzGBORuRcFSfNXDpDbVgzzvANHLqIEcgjCAXsKbNXGouOckToKkZRBnvE'.chars_to_url
=>'http://stackoverflow.com/questions/ask'

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

Вы можете использовать кодирование и декодирование base64.

В зависимости от данных вы можете использовать некоторый алгоритм шифрования и дешифрования для достижения этой цели.Строка будет помещена в текст без специальных символов и т. Д. С дополнительным бонусом зашифрованные данные.

0 голосов
/ 26 мая 2011

Base64 - это простой способ сделать это:

String encoded = Base64.encode("http://stackoverflow.com/questions/ask".getBytes());
System.out.println(encoded);
System.out.println(new String(Base64.decode(encoded)));

Печать:

aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy9hc2s=
http://stackoverflow.com/questions/ask

Обновление:

Если вы посмотрите на URL RFC 1738 , то они не чувствительны к регистру и допускается только диапазон символов. Там достаточно места для сопоставления, если ваши входные строки являются допустимыми закодированными URL.

import string
l = string.ascii_letters + string.digits
t = string.ascii_lowercase + string.digits + ";/?:@=&$-_.+!*'(),"

d = dict(zip(l,t))
e = dict(zip(t,l))

d и e - отображение декодирования и обратного кодирования.

[('a', 'a'), ('b', 'b'), ('c', 'c'), ('d', 'd'), ('e', 'e'), ('f', 'f'), ('g', 'g'), ('h', 'h'), ('i', 'i'), ('j', 'j'), ('k', 'k'), ('l', 'l'), ('m', 'm'), ('n', 'n'), ('o', 'o'), ('p', 'p'), ('q', 'q'), ('r', 'r'), ('s', 's'), ('t', 't'), ('u', 'u'), ('v', 'v'), ('w', 'w'), ('x', 'x'), ('y', 'y'), ('z', 'z'), ('0', 'A'), ('1', 'B'), ('2', 'C'), ('3', 'D'), ('4', 'E'), ('5', 'F'), ('6', 'G'), ('7', 'H'), ('8', 'I'), ('9', 'J'), (';', 'K'), ('/', 'L'), ('?', 'M'), (':', 'N'), ('@', 'O'), ('=', 'P'), ('&', 'Q'), ('$', 'R'), ('-', 'S'), ('_', 'T'), ('.', 'U'), ('+', 'V'), ('!', 'W'), ('*', 'X'), ("'", 'Y'), ('(', 'Z'), (')', '0'), (',', '1')]

Декодирование и кодирование являются только простыми отображениями:

def encode(s): return ''.join(e[c] for c in s)
def decode(s): return ''.join(d[c] for c in s)

Вывод:

enc = encode("http://stackoverflow.com/questions/ask")
>>> decode(enc)
'http://stackoverflow.com/questions/ask'
>>> enc
'httpNLLstackoverflowUcomLquestionsLask'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...