Python:向Windows控制台输出一些UTF-8字符串

6

可能是重复问题:
Python, Unicode, and the Windows console

我从文件中读取了一些字符串,当我尝试在Windows控制台中打印这些utf-8字符串时,出现错误。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

我尝试使用"chcp 65001"将控制台编码设置为utf-8,但是我收到了以下错误信息。
LookupError: unknown encoding: cp65001

6
已修复于Python 3.3版。 - Mark Ransom
1
有没有对于Python 2.7的一些变通方法? - Meloun
这个问题已经出现了几次。这里有一个例子,提供了一种可能有效的解决方法:https://dev59.com/KXVD5IYBdhLWcg3wWaVh - Mark Ransom
1
看这个:https://dev59.com/aXNA5IYBdhLWcg3wpvpg#3259271 - marbdq
1
Daira Hopwood在878972上的回答就是答案。在2.7中,它是wontfix(因为似乎将其回溯到3.1比将其回溯到3.3更加麻烦),在3.3中它被添加,但仍然存在错误,即使在3.5中也是如此,这是由于Microsoft的奇怪之处,并且它取决于当前字体,而不仅仅是chcp 65001。顺便说一下,相关的环境变量设置是SET PYTHONIOENCODING=utf-8(您也可以尝试mbcs),但两者都无法正常工作,因为cp65001有缺陷,winapi也有缺陷(我不确定'mbcs'应该做什么,但它没有帮助)。 - n611x007
2个回答

3
我建议您在stackoverflow上查看类似的问题,那里有很多相关内容。无论如何,您可以按照以下方式进行操作:
1. 以任何编码(例如utf8)从文件中读取,但是将字符串解码为unicode。 2. 对于Windows控制台,请输出unicode字符串。在这种特殊情况下,您不需要编码。您也不需要设置控制台编码,输出文本将自动正确编码。 3. 对于文件,您需要使用codecs模块或以适当的编码进行编码。

好的建议,但需要注意的是,如果您期望控制台支持多种语言,则此方法无法提供。 - Mark Ransom
这对你起作用了吗?我在读取文件的第一个字节之前就遇到了LookupError: unknown encoding: cp65001。它似乎与字符串内容完全无关。好像Python缺少对cp65001的理解,但仍然尝试那种方式,这永远不会起作用,除非你解决它或使用Python 3.3(如果我猜得对的话)。 - n611x007
1
@naxa,是的,Python不支持cp65001。不要将chcp设置为65001。或者在调用Python之前使用set PYTHONIOENCODING=utf-8。另请参见https://dev59.com/aXNA5IYBdhLWcg3wpvpg。 - Jiri
谢谢,我已经找到了。基本思路是使用Python 3.3+,但仍然可能存在错误,在2.7上无法修复,并将控制台中的字体设置为“DejaVu Sans Mono”或等效字体。 :) - n611x007

2

print命令会尝试将Unicode字符串转换为控制台支持的编码格式。请尝试:

>>> import sys
>>> sys.stdout.encoding
'cp852'

它向您展示控制台支持的编码(告诉Python支持什么)。如果字符无法转换为该编码,则无法正确显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接