簡體   English   中英

如何使用Python對字符串進行編碼和解碼以在URL中使用?

[英]How does one encode and decode a string with Python for use in a URL?

我有一個像這樣的字符串:

String A: [ 12234_1_Hello'World_34433_22acb_4554344_accCC44 ]

我想加密字符串A以在干凈的URL中使用。 這樣的事情:

String B: [ cYdfkeYss4543423sdfHsaaZ ]

python中是否有編碼API,給定字符串A,它返回String B? 在python中是否有解碼API,給定String B,它返回String A?

請注意,編碼和加密之間存在巨大差異。

如果你想發送敏感數據,那么不要使用上面提到的編碼;)

進行編碼/解碼的一種方法是使用包base64,例如:

import base64
import sys

encoded = base64.b64encode(sys.stdin.read())
print encoded

decoded = base64.b64decode(encoded)
print decoded

這是你在找什么? 根據您的具體情況,您將得到:

輸入:12234_1_Hello'World_34433_22acb_4554344_accCC44

編碼:MTIyMzRfMV9IZWxsbydXb3JsZF8zNDQzM18yMmFjYl80NTU0MzQ0X2FjY0NDNDQ =

已解碼:12234_1_Hello'World_34433_22acb_4554344_accCC44

您是在加密,壓縮還是只是urlencoding之后? 字符串可以在urlencoding之后傳遞,但這不會像在示例中那樣變小。 壓縮可能會縮小它,但您仍需要對結果進行urlencode。

您是否真的需要隱藏查看器中的字符串數據(例如,敏感數據,不應該被讀取URL的人看到)?

要使它真的很短 - >只需在數據庫中插入一行。 存儲類似(id auto_increment, url)元組的列表。 然后你可以base64編碼id來獲得一個“代理網址”。 通過解碼id並在數據庫中查找正確的url來解碼它。 或者,如果您不介意標識符看起來是順序的,只需使用數字即可。

您是否希望加密字符串或對其進行編碼以刪除網址的非法字符? 如果是后者,你可以使用urllib.quote

>>> quoted = urllib.quote("12234_1_Hello'World_34433_22acb_4554344_accCC44")
>>> quoted
'12234_1_Hello%27World_34433_22acb_4554344_accCC44'

>>> urllib.unquote(quoted)
"12234_1_Hello'World_34433_22acb_4554344_accCC44"

從64版開始,base64模塊為不同的字符串提供字符串的編碼和解碼。

在您的示例中,您將執行以下操作:

import base64
string_b = base64.b64encode(string_a)
string_a = base64.b64decode(string_b)

完整的API: http//docs.python.org/library/base64.html

很難減小字符串的大小並保留任意內容。

您必須將數據限制為可以有效壓縮的內容。

您可以選擇執行以下操作。

  1. 將“URL中的所有參數”保存在數據庫行中。

  2. 為此參數集分配GUID鍵。

  3. 然后提供縮短的GUID密鑰。

另一種縮短字符串的方法是計算字符串的md5 / sha1哈希值(如果你願意,可以與種子連接):

import hashlib
>>> hashlib.sha1("12234_1_Hello'World_34433_22acb_4554344_accCC44").hexdigest()
'e1153227558aadc00a2e90b5013fdd6b0804fdfb'

從理論上講,你應該得到一組具有很少碰撞和固定長度的字符串。 hashlib庫有一個不同的哈希函數數組,您可以使用這種方式使用不同的輸出大小。

編輯:你還說你需要一個可逆的字符串,所以這不適用於那個。 然而,Afaik,許多使用干凈URL的網絡平台似乎想要實現使用哈希函數來計算縮短的URL,然后將該URL與頁面的其他數據一起存儲以提供反向查找功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM