如何在Python 3.0中让print()输出UTF-8?

ne5o7dgx  于 2023-04-19  发布在  Python
关注(0)|答案(5)|浏览(186)

我在WinXP 5.1.2600上工作,编写一个涉及汉语拼音的Python应用程序,这让我陷入了无尽的Unicode问题。切换到Python 3.0解决了其中的许多问题。但是由于一些奇怪的原因,控制台输出的print()函数不支持Unicode。下面是一个小程序。

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

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

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

sys.stdout encoding is "cp1252"
    Traceback (most recent call last):
      File "TestPrintEncoding.py", line 22, in [module]
        print(str1)
      File "C:\Python30\lib\io.py", line 1491, in write
        b = encoder.encode(s)
      File "C:\Python30\lib\encodings\cp1252.py", line 19, in encode
        return codecs.charmap_encode(input,self.errors,encoding_table)[0]
    UnicodeEncodeError: 'charmap' codec can't encode character '\u0101' 
    in position 4: character maps to [undefined]

注意ü = '\xfc' = 252没有问题,因为它是高ASCII码。但是ā = '\u0101'超过8位。
有人知道如何将sys.stdout的编码更改为'utf-8'吗?请记住,Python 3.0不再使用codecs模块,如果我正确理解文档的话。
(Note“coding:”行指定的编码是 source code 的编码,而不是控制台输出的编码。但是谢谢你的想法!)

gstyhher

gstyhher1#

Windows命令提示符(cmd.exe)无法显示您正在使用的Unicode字符,即使Python在内部以正确的方式处理它。您需要使用IDLE、Cygwin或其他可以正确显示Unicode的程序。
请参阅此线程以获得完整的解释:http://www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

jucafojl

jucafojl2#

您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。

elcex8rz

elcex8rz3#

看看here的问题和答案,我认为他们有一些有价值的线索。特别是,注意sys模块中的setdefaultencoding,但也注意到你可能不应该使用它。

bq3bfh9z

bq3bfh9z4#

这里有一个肮脏的黑客:

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

x33g5p2x

x33g5p2x5#

在Windows中用Python显示Unicode字符的问题是已知的。目前还没有官方的解决方案。正确的做法是使用winapi函数WriteConsoleW。构建一个工作解决方案是不平凡的,因为还有其他相关问题。然而,我已经开发了一个软件包,试图解决Python的这个问题。参见https://github.com/Drekin/win-unicode-console。你也可以在那里阅读关于这个问题的更深入的解释。该软件包也在pypi(https://pypi.python.org/pypi/win_unicode_console)上,可以使用pip安装。

相关问题