【发布时间】:2017-12-23 02:49:30
【问题描述】:
使用此代码:
#!/usr/bin/env python3
open("We’re-introducing-a-DNS-man.jpg", "wb")
我得到错误:
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 2: ordinal not in range(128)
该错误仅在通过 Apache 作为 CGI 脚本运行脚本时发生。脚本在命令行运行时运行成功。
我知道我在 Apache 设置语言环境时遇到了很多问题,到目前为止,我已经用以下 3 行代码解决了之前的所有问题。
locale.setlocale(locale.LC_ALL, "en_GB.UTF-8")
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())
sys.stdin = codecs.getwriter('utf-8')(sys.stdin.detach())
但是,我不知道如何解决这个新问题,这似乎又与编码/语言环境有关。我能找到的唯一有点可疑的是(这是添加了前面的行)的结果:
locale.getpreferredencoding(True)
ANSI_X3.4-1968
但是,如果我将参数更改为False,我会得到UTF-8。
如何解决此编码问题?请注意,我研究了 Apache,据我所知,它应该报告 UTF-8,事实上它不是一个单独的问题,而且我无法取得任何进展。
编辑:
这不是文件内容/编码的问题,因为字符串在 Python 3 中显然是 utf-8,并且程序在没有 SyntaxError 的情况下运行。所有明显的解决方案都已尝试过,但都失败了。
问题在于 open() 函数似乎试图将 unicode 字符串转换为 ascii。问题是它为什么要转换成ascii,如何阻止它?
【问题讨论】:
-
'\u2019' 等于
’所以它与文件名有关。 -
以及它正在尝试转换为 ascii 的事实。问题是它为什么要转换成ascii,我该如何阻止它?
-
我不知道 cgi 但是 python 3 默认是
utf-8。你不需要做任何事情就可以做到utf-8。 -
它默认使用utf-8字符串,但仍然存在编码问题。如问题中所述,我不得不添加 3 行代码来修复其他地方的编码问题。例如,如果没有 stdout/stdin 行,则从表单提交中读取输入会出现乱码,因为它不会将 stdin 解释为 utf-8,并且输出到浏览器会中断,因为它不会以 utf-8 打印。它采用环境语言环境的编码,由于某种原因,Apache 谎报语言环境并告诉 Python 使用错误的编码。
标签: python apache python-3.x cgi python-unicode