【问题标题】:python 3.0, how to make print() output unicode?python 3.0,如何使 print() 输出 unicode?
【发布时间】:2010-10-05 03:52:15
【问题描述】:

我正在使用 WinXP 5.1.2600 编写一个涉及中文拼音的 Python 应用程序,这让我遇到了无穷无尽的 Unicode 问题。切换到 Python 3.0 解决了其中的许多问题。但是出于某种奇怪的原因,控制台输出的 print() 函数不支持 Unicode。这是一个小程序。

print('sys.stdout encoding is "' + sys.stdout.encoding + '"')
str1 = 'lüelā'
print(str1)

输出是(为了便于阅读,将尖括号改为方括号):

sys.stdout 编码为“cp1252” 回溯(最近一次通话最后): [模块] 中的文件“TestPrintEncoding.py”,第 22 行 打印(str1) 文件“C:\Python30\lib\io.py”,第 1491 行,写入 b = 编码器.encode(s) 文件“C:\Python30\lib\encodings\cp1252.py”,第 19 行,在编码中 返回 codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError:“charmap”编解码器无法编码字符“\u0101” 在位置 4:字符映射到 [未定义]

请注意 ü = \xfc = 252 没有问题,因为它是高位 ASCII。但是 ā = \u0101 超过 8 位。

有人知道如何将 sys.stdout 的编码更改为“utf-8”吗?请记住,如果我正确理解文档,Python 3.0 不再使用 codecs 模块。


抱歉,我给了你没有序言的程序。在给出的 3 行之前,它的开头是这样的:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

很遗憾,“coding:”行指定的编码是源代码的编码,而不是控制台输出的编码。不过谢谢你的想法!

【问题讨论】:

    标签: unicode console printing python-3.x stdout


    【解决方案1】:

    Windows 命令提示符 (cmd.exe) 无法显示您正在使用的 Unicode 字符,即使 Python 在内部以正确的方式处理它。您需要使用 IDLE、Cygwin 或其他可以正确显示 Unicode 的程序。

    完整的解释请看这个帖子: http://www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

    【讨论】:

    • cmd.exe 可以显示 unicode 字符,如果您使用可以显示所需 unicode 字符的字体,并且如果您将代码页更改为 utf-8(您可以这样做:CHCP 65001
    • 这并不可靠...除了 MSDN 建议使用 UTF-16,所有 Windows NT 操作系统的本机编码。
    • @csde_rats 他们不使用较旧的固定宽度 UCS-2 而不是 UTF-16?
    • 是和不是。不,是的。微软很久以前就使用 UCS-2,但在某个时候切换到了 UTF-16。仍然有一些功能与 UTF-16 不兼容,尤其是。在内核方面......
    【解决方案2】:

    查看问答here,我认为他们有一些有价值的线索。具体来说,请注意sys 模块中的setdefaultencoding,但您可能不应该使用它。

    【讨论】:

      【解决方案3】:

      您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。我写了一个page on my ordeal with this problem

      【讨论】:

        【解决方案4】:

        在 Windows 中用 Python 显示 Unicode 字符的问题是已知的。目前还没有官方解决方案。正确的做法是使用winapi函数WriteConsoleW。由于存在其他相关问题,因此构建一个可行的解决方案并非易事。但是,我已经开发了一个包来尝试修复 Python 关于这个问题。见https://github.com/Drekin/win-unicode-console。您还可以在那里阅读对问题的更深入解释。该软件包也在 pypi (https://pypi.python.org/pypi/win_unicode_console) 上,可以使用 pip 安装。

        【讨论】:

        • 赞成,py -mpip install win-unicode-console & py -mrun your_script.py 是在 Python 3 上使用 cmd.exe 将 Unicode 打印到 Windows 控制台的解决方案(确保您已为控制台窗口配置了适当的字体)。
        • @J.F.Sebastian 使用run 现在被认为是次优的。 run 在我不了解自定义 readline 钩子时需要。 win_unicode_console.enable() 就够了,可以放到sitecustomize 自动运行。然后你可以像往常一样运行你的脚本:py your_script.py.
        • 我不想在我的脚本中使用 win-unicode-console 代码(py -mrun 允许我这样做)。我经常在 Unix 上的 Python 2 上运行相同的脚本,print(unicode_text) 按原样工作。修改sitecustomize 模块对我来说太麻烦了。它可能会影响不相关的代码。要将输出重定向到文件,我设置了 PYTHONIOENCODING 并运行 py your_script.py > output.txt
        【解决方案5】:

        这是一个肮脏的黑客:

        # works
        import os
        os.system("chcp 65001 &")
        print("юникод")
        

        然而一切都打破了它:

        • 简单的静音第一行已经破坏了它:

          # doesn't work
          import os
          os.system("chcp 65001 >nul &")
          print("юникод")
          
        • 检查操作系统类型会破坏它:

          # doesn't work
          import os
          if os.name == "nt":
              os.system("chcp 65001 &")
          
          print("юникод")
          
        • 它甚至在 if 块下都不起作用:

          # doesn't work
          import os
          if os.name == "nt":
              os.system("chcp 65001 &")
              print("юникод")
          

        但是可以用 cmd 的 echo 打印:

        # works
        import os
        os.system("chcp 65001 & echo {0}".format("юникод"))
        

        这是一种跨平台的简单方法:

        # works
        
        import os
        
        def simple_cross_platrofm_print(obj):
            if os.name == "nt":
                os.system("chcp 65001 >nul & echo {0}".format(obj))
            else:
                print(obj)
        
        simple_cross_platrofm_print("юникод")
        

        但是窗口的echo 尾随空行不能被抑制。

        【讨论】:

          猜你喜欢
          • 2019-10-05
          • 1970-01-01
          • 2020-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-04
          • 2016-11-08
          相关资源
          最近更新 更多