python 3.0,如何使 print() 输出 unicode?

Posted

技术标签:

【中文标题】python 3.0,如何使 print() 输出 unicode?【英文标题】:python 3.0, how to make print() output 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:”行指定的编码是源代码的编码,而不是控制台输出的编码。不过谢谢你的想法!

【问题讨论】:

【参考方案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 尾随空行不能被抑制。

【讨论】:

以上是关于python 3.0,如何使 print() 输出 unicode?的主要内容,如果未能解决你的问题,请参考以下文章

PythonStudy——如何使输出不换行

Python——Python缓存技术

python中如何使输出不换行

Python 关于print 输出 zip()的

python学习笔记

python中输出一个九九乘法表