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?的主要内容,如果未能解决你的问题,请参考以下文章