2012-09-08 148 views
0

我想打印一组Unicode字符到我的命令提示符终端。即使我强制编码为“UTF-8”,终端也会打印一些垃圾。打印unicode字符到标准输出python打印错误的字形

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

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

我的默认终端编码是cp437,我试图重写。这里预期的输出是级分斜杠(/)

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

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

我希望我的代码能够处理任何Unicode字符,而不仅仅是这个特殊的例子,因为输入是一个Web查询结果,我无法控制它。

+0

有东西在我的后脑勺告诉我,UTF-8和Windows终端将无法轻松地工作 –

+0

我已经接近后放弃通过这个bug http://bugs.python.org/issue1602 – Benny

+0

你可以找到另一个终端程序来工作,而不是Windows的cmd或其他。我听说可以安装mingw并在那里有一个半工作终端。 Otherwiser,只需安装一个虚拟machinne并为我们的开发工具建立一个合适的Linux环境。 – jsbueno

回答

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 
+0

为我工作!非常感谢! – Benny

5

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

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

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

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

chcp 65001 

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

+0

我刚刚试过这个:'$ chcp 65001 活动代码页:65001 $ python -c“import sys; print sys.stdout.write(u'\ u2044'.encode('UTF-8')) “ 无' – Benny

+0

@Benny:为什么不简单地调用'print(u'\ u2044')'? “sys.stdout.encoding”给你什么? 'print'会自动编码为您的后一种编码。链接的堆栈溢出问题还会告诉您切换控制台的字体。 –

+0

哦,这是我真正开始的地方,这次python本身无法打印,因为它试图使用cp437编码打印Unicode字符,这是一个8位代码点>>> print(u'\ u2044') 回溯(最近呼叫最后一个): 文件“”,第1行,在 文件“C:\ Python27 \ lib \ encodings \ cp437.py”,第12行,编码为 return codecs.charmap_encode(input,errors ,encoding_map) UnicodeEncodeError:'charmap'编解码器无法编码字符u'\ u2044'在位置 0:字符映射到' – Benny