我想要一个可以将任何URL编码为所有字母(大写和小写)字符串的函数,以及另一个将其解码回URL的函数。实现这一目标的最佳方法是什么?
示例API:
> 'http://stackoverflow.com/questions/ask'.url_to_chars
=> 'mgzGBORuRcFSfNXDpDbVgzzvANHLqIEcgjCAXsKbNXGouOckToKkZRBnvE'
> 'mgzGBORuRcFSfNXDpDbVgzzvANHLqIEcgjCAXsKbNXGouOckToKkZRBnvE'.chars_to_url
=>'http://stackoverflow.com/questions/ask'
答案 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编码和解码。
根据数据,您可以使用一些加密和解密算法来完成此任务。它将字符串放入文本中,没有特殊字符等。附加的奖励是数据被加密。