Python3.5.2中urllib.request.urlopen特殊字符(如ø)的正确使用
解决Python 3.5中URL含挪威语字符的UnicodeEncodeError问题
我来帮你搞定这个编码坑!从报错信息能看出来,问题核心是你手动拼接的URL里藏着未正确编码的挪威语字符ø——当http.client尝试把URL转成ASCII编码发送请求时,ø不在ASCII字符范围内,直接触发了UnicodeEncodeError。你之前直接用encode('utf-8')得到的是bytes对象,没法直接嵌入URL字符串里,得用URL专属的百分编码(percent-encoding)来处理才行。
正确处理思路
别再手动拼接URL参数了,尤其是带特殊字符的内容!应该用urllib.parse的工具做编码,同时用JSON字典来构造请求参数,彻底避免字符串拼接的混乱:
- 补充导入
json和urllib.parse模块 - 用字典构造完整请求参数,保留原始的挪威语字符串(比如直接写
"Møre 2013",不用手动转%20) - 把字典转成JSON字符串,确保保留Unicode字符
- 对JSON字符串做URL编码,得到符合规范的查询参数
- 最后拼接成合法URL再发起请求
修改后的完整代码
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import json import urllib.request from urllib.parse import quote_plus # 读取传入的命令行参数 fn = sys.argv[1] minx = sys.argv[2] miny = sys.argv[3] maxx = sys.argv[4] maxy = sys.argv[5] pnavn = sys.argv[6] c = sys.argv[7] u = sys.argv[8] pwd = sys.argv[9] f = sys.argv[10] r = sys.argv[11] # 注意:原代码里用到了r但没读取,这里补上对应参数 # 用字典构造请求参数,结构清晰不易错 request_data = { "username": u, "password": pwd, "copyEmail": "", "comment": fn, "coordInput": { "type": "Polygon", "coordinates": [ [ [minx, maxy], [maxx, maxy], [maxx, miny], [minx, miny], [minx, maxy] ] ] }, "inputWkid": c, "cutNationalBorder": 0, "format": f, "resolution": r, "outputWkid": c, "fillColor": 255, "projects": "Møre 2013", # 保留原始字符串,无需手动编码 "imagemosaic": 2 } # 转成JSON字符串,ensure_ascii=False保留Unicode字符 request_json = json.dumps(request_data, ensure_ascii=False) # 对JSON字符串做URL编码,确保特殊字符符合HTTP规范 encoded_request = quote_plus(request_json) # 构造合法URL url = f"https://tjenester.norgeibilder.no/REST/StartExport.ashx?request={encoded_request}" # 发起请求并输出结果 bestilling = urllib.request.urlopen(url).read() print(bestilling)
为什么这个方法能解决问题?
json.dumps(request_data, ensure_ascii=False):确保转JSON时保留ø这类Unicode字符,不会被强制转成\u00f8格式quote_plus(request_json):自动把所有特殊字符(包括ø、空格)转成URL安全的百分编码(比如ø会变成%C3%B8,空格变成+)- 最终构造的URL完全符合HTTP规范,
http.client发送时不会再触发ASCII编码错误
额外提醒
- 原代码里用到了变量
r但没从sys.argv读取,我补上了r = sys.argv[11],记得要保证bat文件传入的参数数量对应上 - 如果
projects的值是从CSV读取的(也就是sys.argv里的参数),直接把对应变量放到字典里就行,quote_plus会自动处理所有编码问题
内容的提问来源于stack exchange,提问作者9ls1
相关产品推荐
相关产品推荐

