繁体   English   中英

如何使用 Python 3.4 (Windows 8) 将 utf-8 打印到控制台?

[英]How to print utf-8 to console with Python 3.4 (Windows 8)?

我正在尝试将 utf-8 卡片符号(♠、♥、♦︎︎、♣)从 python 模块打印到 Windows 控制台。 我使用的控制台是 git bash,我使用 console2 作为前端。 我已经尝试/阅读了以下多种方法,但到目前为止没有任何效果。

  • 确保控制台可以处理 utf-8 字符。 这两个测试让我相信控制台不是问题所在。

    在此处输入图片说明

  • 从 python 模块尝试同样的事情。
    当我执行 .py 时,这就是结果。

     print(u'♠') UnicodeEncodeError: 'charmap' codec can't encode character '\♠' in position 0: character maps to <undefined>
  • 尝试编码♠。 这给了我以 utf-8 编码的 unicode 集,但仍然没有黑桃符号。

     text = '♠' print(text.encode('utf-8')) b'\\xe2\\x99\\xa0'

我觉得我错过了一步或不了解整个编码/解码过程。 我读过这个这个这个 最后一个页面的提示包裹sys.stdout的入代码,但文章说使用stdout是不必要的,点使用的编解码器模块的另一页。

我想要做的是将 utf-8 卡片符号(♠、♥、♦、♣)从 python 模块打印到 Windows 控制台

UTF-8 是 Unicode 字符的字节编码。 ♠♥♦♣ 是 Unicode 字符,可以用多种编码进行复制,而 UTF-8 是其中一种编码——作为 UTF,UTF-8 可以复制任何 Unicode 字符。 但是这些字符并没有专门的“UTF-8”。

其他可以重现字符 ♠♥♦♣ 的编码是 Windows代码页 850437 ,您的控制台很可能在西欧安装的 Windows 下使用。 您可以在这些编码中打印 ♠,但您没有使用 UTF-8 来执行此操作,并且您将无法使用在 UTF-8 中可用但在这些代码页范围之外的其他 Unicode 字符。

print(u'♠')
UnicodeEncodeError: 'charmap' codec can't encode character '\u2660'

在 Python 3 中,这与您在上面执行的print('♠')测试相同,因此与您的py -3.4相比,您调用包含此print的脚本的方式有所不同。 sys.stdout.encoding从脚本中给你什么?

要使print正常工作,您必须确保 Python 选择正确的编码。 如果从终端设置中没有充分做到这一点,您确实必须将PYTHONIOENCODING设置为cp437

>>> text = '♠'
>>> print(text.encode('utf-8'))
b'\xe2\x99\xa0'

print只能打印 Unicode 字符串。 对于其他类型,包括由encode()方法产生的bytes字符串,它获取对象的文字表示 ( repr )。 b'\\xe2\\x99\\xa0'是编写包含 UTF-8 编码♠ 的 Python 3 字节文字的方式。

如果你想要做的是绕过print的隐式编码到 PYTHONIOENCODING 并替换你自己的,你可以明确地做到这一点:

>>> import sys
>>> sys.stdout.buffer.write('♠'.encode('cp437'))

这当然会为任何不运行代码页 437(例如非西欧安装)的控制台生成错误的输出。 通常,对于使用 C stdio 的应用程序,就像 Python 那样,将非 ASCII 字符发送到 Windows 控制台实在是太不可靠了。

从 Python 3.7.x 开始,您可以重新配置 stdout :

import sys
sys.stdout.reconfigure(encoding='utf-8')

不要编码为utf-8; 直接打印 Unicode:

print(u'♠')

了解如何将 Unicode 打印到 Windows 控制台

我从来没有完全考虑过将 unicode 编码和解码为其他格式(utf-8、utf-16、ascii 等),但我已经遇到了既令人困惑又令人沮丧的问题。 我想要做的是将 utf-8 卡片符号(♠、♥、♦、♣)从 python 模块打印到 Windows 控制台。 我使用的控制台是 git bash,我使用 console2 作为前端。 我已经尝试/阅读了以下多种方法,但到目前为止没有任何效果。 让我知道我正在做的事情是否可行以及正确的做法。

  • 确保控制台可以处理 utf-8 字符。 这两个测试让我相信控制台不是问题所在。

在此处输入图片说明

  • 从 python 模块尝试同样的事情。
    当我执行 .py 时,这就是结果。

     print(u'♠') UnicodeEncodeError: 'charmap' codec can't encode character '\♠' in position 0: character maps to <undefined>
  • 尝试编码♠。 这给了我以 utf-8 编码的 unicode 集,但仍然没有黑桃符号。

     text = '♠' print(text.encode('utf-8')) b'\\xe2\\x99\\xa0'

我觉得我错过了一步或不了解整个编码/解码过程。 我读过这个这个这个 最后一个页面的提示包裹sys.stdout的入代码,但文章说使用stdout是不必要的,点使用的编解码器模块的另一页。

我很混乱! 我觉得很难找到关于这个主题的思想质量文档,希望有人能解决这个问题。 任何帮助总是不胜感激!

奥斯汀

我在 python 3.6 上遇到了同样的问题。 但是,我使用 python 3.7 解决了这个问题。 所以,你只需更新python版本。

你可以这样看。 字符串是字符序列,而不是字节序列。 字符是 Unicode 代码点。 字节只是 0-255 范围内的数字。 在底层,计算机只处理字节序列。 如果要打印字符串,只需在 Python 中调用print(a_string) 但是为了与操作系统环境通信,必须将字符串编码为字节序列。 这是在print功能的引擎盖下自动完成的。 使用的编码是sys.stdout.encoding 如果您收到UnicodeEncodeError ,则意味着您的字符无法使用当前编码进行编码。

据我所知,目前无法在 Windows 上运行 Python 的方式是,所使用的编码能够对每个字符(如 UTF-8 或 UTF-16)进行编码,并且既由 Python 假定,又由 Python 实际使用输入和输出的操作系统环境。 有一个解决方法——你可以使用win_unicode_console包,它旨在解决这个问题。 只需通过pip install win_unicode_console安装它,然后在您的sitecustomize导入它并调用win_unicode_console.enable() 这将作为解决此问题的 Python 安装的外部补丁。 有关更多信息,请参阅文档: https : //github.com/Drekin/win-unicode-console

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM