如何制作 python 3 print() utf8

Posted

技术标签:

【中文标题】如何制作 python 3 print() utf8【英文标题】:How to make python 3 print() utf8 【发布时间】:2011-04-05 13:52:36 【问题描述】:

如何将 python 3 (3.1) print("Some text") 转换为 UTF-8 中的标准输出,或者如何输出原始字节?

Test.py

​​>
TestText = "Test - āĀēĒčČ..šŠūŪžŽ" # this is UTF-8
TestText2 = b"Test2 - \xc4\x81\xc4\x80\xc4\x93\xc4\x92\xc4\x8d\xc4\x8c..\xc5\xa1\xc5\xa0\xc5\xab\xc5\xaa\xc5\xbe\xc5\xbd" # just bytes
print(sys.getdefaultencoding())
print(sys.stdout.encoding)
print(TestText)
print(TestText.encode("utf8"))
print(TestText.encode("cp1252","replace"))
print(TestText2)

输出(在 CP1257 中,我将字符替换为字节值[x00]):

utf-8
cp1257
Test - [xE2][xC2][xE7][C7][xE8][xC8]..[xF0][xD0][xFB][xDB][xFE][xDE]  
b'Test - \xc4\x81\xc4\x80\xc4\x93\xc4\x92\xc4\x8d\xc4\x8c..\xc5\xa1\xc5\xa0\xc5\xab\xc5\xaa\xc5\xbe\xc5\xbd'
b'Test - ??????..\x9a\x8a??\x9e\x8e'
b'Test2 - \xc4\x81\xc4\x80\xc4\x93\xc4\x92\xc4\x8d\xc4\x8c..\xc5\xa1\xc5\xa0\xc5\xab\xc5\xaa\xc5\xbe\xc5\xbd'

print 太聪明了... :D 使用带有print 的编码文本是没有意义的(因为它总是只显示字节的表示而不是实际字节)并且根本不可能输出字节,因为无论如何都要打印并始终将其编码为sys.stdout.encoding

例如:print(chr(255)) 抛出错误:

Traceback (most recent call last):
  File "Test.py", line 1, in <module>
    print(chr(255));
  File "H:\Python31\lib\encodings\cp1257.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xff' in position 0: character maps to <undefined>

顺便说一下print( TestText == TestText2.decode("utf8")) 返回False,虽然打印输出是一样的。


Python 3 如何确定sys.stdout.encoding 以及如何更改它?

我制作了一个 printRAW() 函数,它工作正常(实际上它将输出编码为 UTF-8,所以它真的不是原始的......):

 def printRAW(*Text):
     RAWOut = open(1, 'w', encoding='utf8', closefd=False)
     print(*Text, file=RAWOut)
     RAWOut.flush()
     RAWOut.close()

 printRAW("Cool", TestText)

输出(现在以 UTF-8 打印):

Cool Test - āĀēĒčČ..šŠūŪžŽ

printRAW(chr(252)) 也可以很好地打印 ü(在 UTF-8 中,[xC3][xBC])并且没有错误:)

现在我正在寻找更好的解决方案,如果有的话......

【问题讨论】:

检查this。 【参考方案1】:

我在 Python 3.6 中尝试了zwol's solution,但它对我不起作用。有些字符串没有输出到控制台。

但iljau's solution 有效:使用不同的编码重新打开标准输出。

import sys
sys.stdout = open(1, 'w', encoding='utf-8', closefd=False)

【讨论】:

【参考方案2】:

据此answer

您可以从python 3.7手动重新配置标准输出的编码

import sys
sys.stdout.reconfigure(encoding='utf-8')

【讨论】:

【参考方案3】:

澄清:

TestText = "Test - āĀēĒčČ..šŠūŪžŽ" # this not UTF-8...it is a Unicode string in Python 3.X.
TestText2 = TestText.encode('utf8') # this is a UTF-8-encoded byte string.

要将 UTF-8 发送到标准输出而不考虑控制台的编码,请使用其缓冲区接口,该接口接受字节:

import sys
sys.stdout.buffer.write(TestText2)

【讨论】:

谢谢 :) 顺便说一句:“Test - āĀēĒčČ..šŠūŪžŽ” # 这是 UTF-8 我的意思是字符串是用 IDE 用 UTF-8 编写的,py 文件是 UTF 编码的-8,当 python 解析文件时,它将字符串转换为 Python unicode... 我得到:回溯(最近一次调用最后一次):文件“”,第 1 行,在 AttributeError:'_ReplOutput' 对象没有属性'buffer' Python 3?我们在使用 IDE 吗? _ReplOutput 听起来像是 stdout 被一个(不正确的)类似文件的对象替换了。 (好吧,尽管我很挣扎,但我不能在这里发布多行错误消息)嗯... >>> sys.stdout.buffer().write(chr(255)) Traceback(最近一次调用last): 中的文件“”第 1 行 TypeError: '_io.BufferedWriter' object is not callable >>> sys.stdout.buffer.write(chr(252)) Traceback (最近一次调用最后): 中的文件“”第 1 行 TypeError: 'str' does not support the buffer interface Python 3.2.2 @VanJone,发布一个新问题。【参考方案4】:

这是我能从手册中得到的最好的东西,而且有点脏:

utf8stdout = open(1, 'w', encoding='utf-8', closefd=False) # fd 1 is stdout
print(whatever, file=utf8stdout)

似乎文件对象应该有一种方法来改变它们的编码,但 AFAICT 没有。

如果你写入 utf8stdout 然后写入 sys.stdout 而不先调用 utf8stdout.flush(),反之亦然,可能会发生不好的事情。

【讨论】:

在 Windows 上出现问题,cp1257 用于打印(但失败),而我想要utf-8。以下 sn-p 工作:import sys; sys.stdout = open(1, 'w', encoding='utf-8', closefd=False); print("vadsэавфыаЭХÜÜÄ"); print(bytes("аЭХÜ", "utf-8")) @zwol and all:Python 3 print 函数被定义和设计为不处理 Unicode 的基本原理是什么? @OldGeezer 这不正确。它被定义和设计为处理 Unicode。但是解释器认为,出于某种我们可能永远不会知道的原因,sys.stdout 正在馈送到一个处理 Unicode、只有 CP1257 的终端仿真器,因此 print(实际上sys.stdout.write) 必须在打印前将 from Unicode to CP1257 转换,并且任何不在 CP1257 库中的字符根本无法打印(除非它首先被转义,这print 不会为你做)。

以上是关于如何制作 python 3 print() utf8的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.5 中编码 utf-8 和 utf8 的区别

Python 列表字典制作名册管理

python_基础语法1

Python之路06-信用卡

Python 3.x 编解码

python入门