Python URL 百分号编码与解码
ailx10说:这篇是在2023年7月之前写的,后来又改过。这篇起于一个很基础的面试问题:网络传输为什么要做 URL 编码?问题听着简单,真要解释清楚,就得分开看特殊字符怎样影响解析、中文等字符怎样变成传输中的字节表示。我没有铺太大,就用 Python 的 quote 和 unquote 写了两个小例子,来回对照编码前后。它像一页随手保存的工具笔记,遇到实际参数时可以拿出来试。需要留意的是,不同位置和工具对斜杠、空格等字符的处理不完全一样,能编码再解码,不代表所有 URL 场景都能照用同一个写法。
URL 的不同部分使用某些字符分隔结构。当数据中包含这些字符、空格或非 ASCII 文本时,应针对具体 URL 组件进行编码,避免把数据误当成分隔符。
编码和解码单个组件
from urllib.parse import quote, unquote
value = "网络安全 / Python\n入门"
encoded = quote(value, safe="")
print(encoded)
print(unquote(encoded))
assert unquote(encoded) == value
quote 将需要转义的数据编码为 %xx 形式,默认使用 UTF-8;safe="" 表示斜杠等保留字符也按组件数据处理。字母、数字和 _.-~ 等不需要编码的字符仍会保留。
构造查询字符串
构造查询参数时优先使用 urlencode,由它处理参数分隔符和值:
from urllib.parse import urlencode, parse_qs
query = urlencode({"q": "网络安全 / Python"})
print(query)
print(parse_qs(query)["q"][0])
urlencode 默认使用表单风格编码:空格通常表示为 +;普通 quote 默认将空格编码为 %20。不要把整个 URL 一次性编码成单个组件,也不要将百分号编码当成加密。
来回转换能帮助检查数据有没有变,但不表示所有URL组件都能用同一套默认值。把safe参数和使用位置一起记下,代码才不会只在眼前这个例子里碰巧合适。
本文摘要与文字整理有 AI 参与。
========================if i have some wrong, please give me a message, thx.========================
浙公网安备 33010602011771号