【问题标题】:Python 3 UnicodeEncodeError (Apache)Python 3 UnicodeEncodeError (Apache)
【发布时间】: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


【解决方案1】:
open("We’re-introducing-a-DNS-man.jpg", "wb")

改成

open("We're-introducing-a-DNS-man.jpg", "wb")

您不需要(右单引号)。请改用' (QUOTE)。

如果您的文件名是动态生成的,则需要在将其作为文件打开之前进行替换。

【讨论】:

  • 谢谢,但这只是我将问题简化为一行。我的实际代码是从远程 SFTP 服务器获取文件,因此文件名是动态的,而不是硬编码的。我需要修复编码问题,而不是愚蠢的文件名。
  • @SamBull 我不认为open('filename.jpg", "wb") 会给出 unicode 错误。您需要添加更详细的代码,以便有人可以提供帮助。
  • 我已经用那行代码重现了这个问题,而且只有那行代码。使用仅包含该行的 Python 脚本,当它作为 CGI 脚本从 Apache 运行时出现解码错误。
  • 那么问题出在 cgi 脚本上,因为"wb" 模式会写入字节而不是字符串。
  • 它没有写任何东西。在成功打开文件之前,文件名上发生了解码错误。
【解决方案2】:

确保您的.py 文件具有编码utf-8,在记事本++ 中您可以使用Encoding -> Convert to UTF-8 对其进行转换,然后在.py 文件的顶部添加

# -*- coding: utf-8 -*-
fl = open(u"We’re-introducing-a-DNS-man.txt", "r")
print(fl.read())

尝试像上面一样添加u"filename"

我如何使用 utf8 字符编码修复错误

演示

【讨论】:

  • 不是我。但是,我已经尝试过了,但没有运气(我认为这更像是 Python 2 的事情)。问题不是源文件的编码(默认情况下在 Python 3 中应该是 UTF-8),而是与运行环境中的编码有关。我知道 unicode 的所有明显错误,这更难。
  • 好吧,答案仍然是错误的。而不是应该影响 Python 3 的东西。由于编码,您的图像甚至显示 SyntaxError,而不是 UnicodeEncodeError。所以,与问题无关。
  • SyntaxError 发生是因为您的文件有问题。 UnicodeEncodeError 是在运行时尝试转换字符串时发生的事情,因此与文件本身无关。
  • @SamBull 你试过添加u 比如open(u"We’re-introducing-a-DNS-man.jpg", "wb")
  • 同样的问题。默认情况下,字符串是 Unicode(Python 3)。问题不在于字符串本身,而在于它试图在 open() 函数中将 unicode 字符串转换为 ascii。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多