Python3.5中urllib.parse.unquote出现乱码问题如何解决
使用
urllib.parse.unquote(from_ur) 解码
%E7%8E%8B%E7%90%BC%E8%8C%B6%E8%89%BA
%E5%B0%8F%E7%BD%90%E8%8C%B6%E8%83%8C%E6%99%AF%E6%AD%8C%E6%9B%B2
%C2%BD%D3%F0%CD%BC%C6%AC
%E5%B0%8F%E7%BD%90%E8%8C%B6%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90
%C2%CC%B2%E8
%C2%CC%B2%E8%CD%BC%C6%AC%B4%F3%C8%AB
%BB%B1%BB%A8%B2%E8
%E7%8E%8B%E7%90%BC%E8%A1%8C%E8%8C%B6%E5%8D%81%E5%BC%8F
%E5%B0%8F%E7%BD%90%E8%8C%B6%E7%9A%84%E5%85%AB%E4%B8%AA%E5%A4%A7%E5%B8%88
%E9%BE%99%E4%BA%95%E8%8C%B6%E5%A5%BD%E5%9D%8F%E5%9B%BE%E7%89%87
%E9%9B%80%E8%88%8C%E8%8C%B6%E5%8F%B6%E5%B1%9E%E4%BA%8E%E4%BB%80%E4%B9%88%E8%8C%B6
%E7%9B%96%E7%A2%97%E8%8C%B6%E6%AD%A3%E7%A1%AE%E7%9A%84%E5%96%9D%E6%B3%95%E5%9B%BE%E8%A7%A3
%E7%A2%A7%E6%BD%AD%E9%A3%98%E9%9B%AA%E7%9A%84%E5%8A%9F%E6%95%88%E4%B8%8E%E4%BD%9C%E7%94%A8
%E8%8C%B6%E9%81%93
%BA%DA%BF%E0%DC%F1
%E8%8C%B6%E7%9A%84%E5%B9%BF%E5%91%8A%E6%AD%8C%E6%9B%B2
%E4%BF%A1%E9%98%B3%E6%AF%9B%E5%B0%96
%E5%AE%89%E5%90%89%E7%99%BD%E8%8C%B6%E5%9B%BE%E7%89%87
%E6%80%8E%E6%A0%B7%E5%8A%A0%E7%9B%9F%E5%B0%8F%E7%BD%90%E8%8C%B6
%E5%AE%89%E6%BA%AA%E8%8C%B6%E5%8F%B6%E6%89%B9%E5%8F%91%E5%B8%82%E5%9C%BA
%E7%A2%A7%E8%9E%BA%E6%98%A5
%E8%8B%A6%E8%8D%9E
%BA%DA%BF%E0%DC%F1%B2%E8
部分乱码
有什么好的解决方法吗
Python3.5中urllib.parse.unquote出现乱码问题如何解决
在Python 3.5中,urllib.parse.unquote处理非ASCII字符时确实可能出乱码,因为默认解码方式的问题。你需要手动指定正确的编码,通常是'utf-8'。
核心原因是:unquote默认使用'utf-8'解码,但有时字节序列可能被错误解释。对于URL中的中文等字符,确保编码一致是关键。
解决方法:
- 标准情况(UTF-8编码URL):直接使用
unquote,并显式指定encoding='utf-8'和errors='replace'(或'ignore')来处理意外字节。 - 非UTF-8编码URL(如GBK):先按原始字节解码,再用目标编码重新编码。
代码示例:
from urllib.parse import unquote
# 情况1:UTF-8编码的URL(最常见)
url_utf8 = "https://example.com/search?q=%E4%B8%AD%E6%96%87"
decoded_utf8 = unquote(url_utf8, encoding='utf-8', errors='replace')
print("UTF-8解码:", decoded_utf8) # 输出: https://example.com/search?q=中文
# 情况2:已知是GBK编码的URL(较少见)
url_gbk = "https://example.com/search?q=%D6%D0%CE%C4" # "中文"的GBK编码
# 先按'latin-1'(或'iso-8859-1')无损获取字节,再用GBK解码
decoded_gbk = unquote(url_gbk, encoding='latin-1').decode('gbk')
print("GBK解码:", decoded_gbk) # 输出: https://example.com/search?q=中文
# 情况3:不确定编码时,可尝试常见编码(UTF-8优先)
def safe_unquote(url, encodings=('utf-8', 'gbk', 'gb2312')):
for enc in encodings:
try:
return unquote(url, encoding=enc, errors='strict')
except UnicodeDecodeError:
continue
# 所有编码都失败,使用替换错误处理
return unquote(url, encoding='utf-8', errors='replace')
test_url = "https://example.com/test?name=%E4%B8%AD%E6%96%87"
print("安全解码:", safe_unquote(test_url))
关键点:
- 明确URL的原始编码是关键,大多数现代网站用UTF-8。
- 使用
errors='replace'可避免解码失败崩溃,但可能丢失信息。 - 如果乱码表现为“%XX”形式未被解码,可能是双重编码,需要调用两次
unquote。
总结建议:优先显式指定encoding='utf-8'并处理错误。

