解决’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” 的错误了。

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注