下劃線不需要編碼,因爲它們是URL中的有效字符。
作爲每RFC 1738:
不安全:
字符可以是不安全的多種原因。空格 字符是不安全的,因爲重要的空格可能會消失,並且當轉錄URL或 排版或受到文字處理程序的處理時可能會引入不重要的空格。 字符<
和>
是不安全的,因爲它們被用作圍繞自由文本的URL的 分隔符;引號("
)用於在某些系統中爲 分隔URL。字符#
是不安全的,並且應始終編碼 ,因爲它在萬維網和其他 系統中用於從可能遵循它的片段/錨點標識符中劃分URL。字符%
是不安全的,因爲它用於 其他字符的編碼。其他字符是不安全的,因爲 網關和其他傳輸代理有時會修改 這樣的字符。這些字符是{
,}
,|
,\
,^
,~
, [
,]
和`
。
所有不安全的字符必須始終在URL中進行編碼。
所以_
不%5F
取代的原因是a
不被%61
替代的相同的理由:它只是沒有必要的。 Web服務器不會(或不應該)關心這兩種方式。
如果你想使用Web服務器做護理(但請先檢查,如果是這樣的話),你就必須做一些體力勞動,如urllibs報價does not support quoting_
:
的urllib.parse。quote(string,safe ='/',encoding = None,errors = None)
使用%xx
轉義替換字符串中的特殊字符。字母,數字和字符_.-
從不引用。
您可以用自己的功能包裝quote()
並將其傳遞給urlencode()
。像這樣(完全未經測試):
def extra_quote(*args, **kwargs):
quoted = urllib.pars.quote(*args, **kwargs)
return str.replace(quoted, '_', '%5F')
urllib.parse.urlencode(query, quote_via=extraquote)
謝謝!我用你說的和我讀過我的代碼。 。 。事實證明,我使用'int(time.time())'而不是'int(time())'作爲時間戳。 。 。 >< – XaNaX