Python中使用urllib实现西里尔字母小写URL编码
解决urllib.parse.urlencode生成小写URL编码的问题
当使用Python的urllib.parse.urlencode处理包含非ASCII字符(比如西里尔文)的字典时,默认生成的URL编码是大写的十六进制格式,但如果对接服务要求必须使用小写编码,可以通过以下两种方法解决:
方法一:正则替换默认编码结果
先用urlencode生成标准编码字符串,再用正则表达式将%后的大写十六进制字符替换为小写:
import urllib.parse import re target_dict = {"Animal": "Cat", "city": "Москва"} # 生成默认大写编码 encoded_str = urllib.parse.urlencode(target_dict) # 替换%后的大写十六进制为小写 lowercase_encoded = re.sub(r'%([0-9A-F]{2})', lambda m: f'%{m.group(1).lower()}', encoded_str) print(lowercase_encoded) # 输出: Animal=Cat&city=%d0%9c%d0%be%d1%81%d0%ba%d0%b2%d0%b0
方法二:手动编码键值对后拼接
逐个对字典的键和值进行URL编码,将编码结果转为小写后再拼接成最终的查询字符串:
import urllib.parse target_dict = {"Animal": "Cat", "city": "Москва"} encoded_pairs = [] for key, val in target_dict.items(): # 分别编码键和值并转小写 encoded_key = urllib.parse.quote(key).lower() encoded_val = urllib.parse.quote(val).lower() encoded_pairs.append(f"{encoded_key}={encoded_val}") lowercase_encoded = '&'.join(encoded_pairs) print(lowercase_encoded) # 输出: Animal=Cat&city=%d0%9c%d0%be%d1%81%d0%ba%d0%b2%d0%b0
方法对比
- 方法一更简洁高效,适合无额外处理需求的常规场景;
- 方法二更灵活,若需要对单个键或值做自定义处理(比如特殊字符过滤)时更适用。
内容的提问来源于stack exchange,提问作者oruchkin
相关产品推荐
相关产品推荐

