问题描述
|
我想要一个可以将任何URL编码为所有字母(大写和小写)的字符串的函数,以及另一个将其解码回URL的函数。做到这一点的最佳方法是什么?
示例API:
> \'http://stackoverflow.com/questions/ask\'.url_to_chars
=> \'mgzGBORuRcFSfNXDpDbVgzzvANHLqIEcgjCAXsKbNXGouOckToKkZRBnvE\'
> \'mgzGBORuRcFSfNXDpDbVgzzvANHLqIEcgjCAXsKbNXGouOckToKkZRBnvE\'.chars_to_url
=>\'http://stackoverflow.com/questions/ask\'
解决方法
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是不区分大小写的,并且只允许使用一定范围的字符。只要您输入的字符串是有效的编码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\'
,您可以使用base64编码和解码。
根据数据,您可以使用一些加密和解密算法来完成此操作。它将把字符串放入没有特殊字符等的文本中。此外,还对数据进行了加密。