在python中将unicode字符打印到stdout会打印错误的字形

时间:2012-09-08 11:10:50

标签: python windows terminal utf

我想在命令提示终端上打印一组Unicode字符。即使我强制编码为“UTF-8”,终端也会打印一些垃圾。

$python -c "import sys; print sys.stdout.write(u'\u2044'.encode('UTF-8'))"
ΓüäNone

$python -c "import sys; print sys.stdout.encoding"
cp437

我的默认终端编码是cp437,我试图覆盖它。这里的预期输出是Fraction slash(/)

http://www.fileformat.info/info/unicode/char/2044/index.htm

同一段代码在我的Mac终端中完美运行,它使用UTF-8作为默认编码。有没有办法在Windows上显示这个?我在Windows命令提示符下使用的字体是consolas。

我希望我的代码可以使用任何Unicode字符,而不仅仅是这个特定的例子,因为输入是一个Web查询结果,我无法控制它。

2 个答案:

答案 0 :(得分:6)

Python无法控制终端使用的编码;你必须在其他地方改变它。

换句话说,仅仅因为你强制python将UTF-8编码的文本输出到终端,并不意味着你的终端会神奇地开始接受输出为UTF-8。< / p>

Mac OS X终端已配置为使用UTF-8。

在Windows上,您可以使用chcp命令切换控制台代码页:

chcp 65001

其中65001是UTF-8的Windows代码页。见Unicode characters in Windows command line - how?

答案 1 :(得分:2)

您必须使用UTF-8代码页(cp65001)才能显示UTF-8编码文本。

Python 3.3声称在Windows上支持代码页65001(UTF-8)。

C:\>chcp 65001
Active code page: 65001

C:\>python
Python 3.3.0rc1 (v3.3.0rc1:8bb5c7bc46ba, Aug 25 2012, 13:50:30) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('\u2044')
⁄

虽然它是错误的:

>>> print('\u2044')
⁄

>>> print('\u2044'*8)
⁄⁄⁄⁄⁄⁄⁄⁄
��⁄⁄⁄⁄
⁄⁄
��

>>> print('1\u20442 2\u20443 4\u20445')
1⁄2 2⁄3 4⁄5
⁄5