将URL编码(和解码)为字母串

时间:2011-05-26 07:32:20

标签: algorithm string encoding

我想要一个可以将任何URL编码为所有字母(大写和小写)字符串的函数,以及另一个将其解码回URL的函数。实现这一目标的最佳方法是什么?

示例API:

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


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

2 个答案:

答案 0 :(得分:0)

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

<强>更新

如果您实际查看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'

答案 1 :(得分:-1)

您可以使用base64编码和解码。

根据数据,您可以使用一些加密和解密算法来完成此任务。它将字符串放入文本中,没有特殊字符等。附加的奖励是数据被加密。