You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字典来构造请求参数,彻底避免字符串拼接的混乱:

  1. 补充导入json和urllib.parse模块
  2. 用字典构造完整请求参数,保留原始的挪威语字符串(比如直接写"Møre 2013",不用手动转%20)
  3. 把字典转成JSON字符串,确保保留Unicode字符
  4. 对JSON字符串做URL编码,得到符合规范的查询参数
  5. 最后拼接成合法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:53:45