解决’latin-1′ codec can’t encode characters in position 0-6: ordinal not in range(256)
这个错误主要是由于 HTTP 请求头中的某些字段中包含中文字符,而 HTTP 头部默认要求使用 ISO‑8859‑1(latin‑1)编码,导致无法编码中文字符。也就是说,错误并非发生在请求的 JSON 负载(payload)上,而是在请求头中,比如你设置的 "X-Title": "面试题问答助手"
字段。
以下是一些解决方案和建议:
1. 移除或修改包含非 ASCII 字符的 header
推荐方案: 如果这个 header 不是必需的,可以直接移除或者使用纯 ASCII 字符代替,例如:
self.headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json", "HTTP-Referer": "https://your-website.com", # 修改为ASCII字符 "X-Title": "InterviewQA Assistant" }
如果这个 header 是必须的,而不能去掉,你可以考虑对其进行适当的编码(比如使用 RFC 2047 编码格式),不过这会让服务器端解析时复杂一些。
2. 使用 RFC 2047 对 header 进行编码
RFC 2047 允许你在邮件或 HTTP header 中使用非 ASCII 字符,格式类似于:
=?utf-8?B?base64_encoded_text?=
例如,对于 "面试题问答助手"
你可以先用 Base64 编码:
import base64 title = "面试题问答助手" title_encoded = base64.b64encode(title.encode('utf-8')).decode('ascii') encoded_header = f"=?utf-8?B?{title_encoded}?="
然后将 header 设置为:
self.headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json", "HTTP-Referer": "https://your-website.com", "X-Title": encoded_header }
注意: 这种方法要求服务器端能够正确解析 RFC 2047 编码的 header,否则可能会导致其它问题。
3. 总结
- 问题根源: HTTP 请求头默认使用 ISO‑8859‑1 编码,导致中文字符无法直接编码。
- 直接解决: 最简单的办法是确保所有请求头的值都是 ASCII 字符,如果不需要特别的中文描述,可以直接替换掉中文内容。
- 高级处理: 如需保留中文描述,则可以采用 RFC 2047 编码,但这需要双方都支持并正确处理这种编码格式。
修改后,重新运行代码应该就不会出现 “’latin-1′ codec can’t encode characters” 的错误了。