Windows控制台上Python中的UnicodeEncodeError

时间:2014-01-02 13:27:06

标签: python python-3.x unicode

在递归目录中的文件并在控制台中打印文件名时出现以下错误:

Traceback (most recent call last):
  File "C:\Program Files\Python33\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2013' in position
53: character maps to <undefined>

根据错误,文件名字符串中的一个字符是\u2013,这是与常见的减去字符不同的EN DASH -字符。

我已检查设置为437的Windows编码。现在,我看到有两个选项可以通过更改Windows控制台的编码或将文件名中的字符转换为适合控制台编码来解决此问题。我将如何在Python 3.3中实现这一目标?

2 个答案:

答案 0 :(得分:6)

Windows控制台正在使用cp437编码,并且该编码不支持字符\ u2013。尝试将其添加到您的代码中:

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,'cp437','backslashreplace')

答案 1 :(得分:5)

  

或从文件名转换get中的字符以适合控制台编码

可能是控制台编码已经正确(虽然无法从错误消息中判断)。代码页437根本不包含该字符,因此您将无法打印它。

您可以使用具有后备编码的文本编码器重新打开stdout,如iamsudip使用backslashreplace的答案所示,至少可以获得可读(如果不是可靠的可恢复)输出而不是错误

  

更改Windows控制台的编码

您可以通过在运行Python之前执行控制台命令chcp 1252来执行此操作,但这仍然只会为您提供不同的可打印字符库 - 包括U + 2013,但不会有很多其他Unicode字符。

理论上你可以chcp到65001获得UTF-8,这样你就可以打印任何角色。不幸的是,C运行时的标准IO实现中存在严重的错误,这通常会使其在实践中无法使用。

这种令人遗憾的事态会影响使用MS C运行时的stdio库调用的所有应用程序,包括Python和大多数其他语言,结果是Windows控制台上的Unicode在大多数情况下都不起作用。

如果你真的必须将Unicode输出到Windows控制台,你可以直接使用WriteConsoleW使用Win32 ctypes API,但这并不是很有趣。