【问题标题】:Printing unicode characters to stdout in python prints wrong glyphs在 python 中将 unicode 字符打印到标准输出会打印错误的字形
【发布时间】:2012-09-02 01:12:26
【问题描述】:

我想将一组 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,我正在尝试覆盖它。这里的预期输出是分数斜线 ( ⁄ )

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

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

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

【问题讨论】:

  • 我的脑后有些东西告诉我 UTF-8 和 Windows 终端不会轻易工作
  • 在经历了这个错误bugs.python.org/issue1602之后,我已经快要放弃了
  • 你可以找到另一个终端程序来工作,而不是 Windows 'cmd 或其他什么。我听说可以安装 mingw 并在那里有一个半工作的终端。否则,只需安装虚拟机并为我们的开发内容设置适当的 Linux 环境。

标签: python windows terminal utf


【解决方案1】:

您必须使用 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

【讨论】:

    【解决方案2】:

    Python 无法控制终端使用的编码;您必须在其他地方进行更改。

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

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

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

    chcp 65001
    

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

    【讨论】:

    • 我也试过了:$chcp 65001 Active code page: 65001 $python -c "import sys; print sys.stdout.write(u'\u2044'.encode('UTF-8'))" ���None
    • @Benny:为什么不直接打电话给print(u'\u2044')? sys.stdout.encoding 给了你什么? print 将自动为您编码为后一种编码。链接的 Stack Overflow 问题还告诉您为控制台切换字体。
    • 哦,那是我真正开始的地方,这次 python 本身无法打印,因为它试图使用 cp437 编码打印 Unicode 字符,这是一个 8 位代码点 >>> print(u'\u2044') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\encodings\cp437.py", line 12, in encode return codecs.charmap_encode(input,errors,encoding_map) UnicodeEncodeError: 'charmap' codec can't encode character u'\u2044' in position 0: character maps to <undefined>
    • @Benny:是的,这就是你必须找到一种方法来强制你的终端接受 UTF-8。如果dhcp 65001对你不起作用,再加上切换字体,我不知道会怎样。
    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2017-09-08
    相关资源
    最近更新 更多