18

我在 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”?请记住codecs,如果我正确理解文档,Python 3.0 不再使用该模块。


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

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

import sys

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

4

5 回答 5

15

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

有关完整说明,请参阅此线程:http: //www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

于 2009-02-03T14:34:08.553 回答
12

您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。我已经写了一页关于这个问题的磨难

于 2010-10-26T20:37:12.763 回答
2

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

于 2009-02-19T11:13:57.370 回答
1

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

于 2015-04-09T16:00:08.997 回答
1

这是一个肮脏的黑客:

# 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不能抑制窗口的尾随空行。

于 2015-05-28T11:42:12.660 回答