我在看这个question并开始想知道 print
是什么意思实际上做。
我一直不知道如何使用string.decode()
和 string.encode()
在 python 交互式 shell 中以与打印相同的格式获取 unicode 字符串“out”。无论我做什么,我都会得到
这是python 2.x,但我已经在尝试改正我的方法并实际调用
print()
:)例子:
>>> import sys
>>> a = '\xAA\xBB\xCC'
>>> print(a)
ª»Ì
>>> a.encode(sys.stdout.encoding)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xaa in position 0: ordinal not in range(128)
>>> a.decode(sys.stdout.encoding)
u'\xaa\xbb\xcc'
编辑 :
我为什么要问这个?我厌倦了
encode()
错误并意识到,因为 print
可以做到(至少在交互式 shell 中)。我知道一定有办法神奇地进行编码 正确 ,通过挖掘信息从某处使用什么编码......附加信息 :
我在 linux2 上运行 Python 2.4.3 (#1, Sep 3 2009, 15:37:12) [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)]
>>> sys.stdin.encoding
'ISO-8859-1'
>>> sys.stdout.encoding
'ISO-8859-1'
但是,结果与 Python 2.6.2 (r262:71600, Sep 8 2009, 13:06:43) 在同一个 linux 机器上的结果相同。
最佳答案
编辑: (此编辑与上一个编辑之间的主要更改...注意:我在 Ubuntu 机器上使用 Python 2.6.4。)
首先,在我第一次尝试回答时,我提供了一些关于 print
的一般信息。和 str
我将在下面留下这些内容,以方便任何在 print
上遇到更简单问题的人并偶然发现这个问题。至于处理 OP 遇到的问题的新尝试......基本上,我倾向于说这里没有 Elixir ,如果 print
以某种方式设法理解一个奇怪的字符串文字,那么这不是可重现的行为。通过在终端窗口中与 Python 进行以下有趣的交互,我得出了这个结论:
>>> print '\xaa\xbb\xcc'
��
您是否尝试过直接从终端输入 ª»Ì ?在使用 utf-8 作为编码的 Linux 终端上,这实际上被读取为六个字节,然后可以在
decode
的帮助下使其看起来像三个 unicode 字符。方法:>>> 'ª»Ì'
'\xc2\xaa\xc2\xbb\xc3\x8c'
>>> 'ª»Ì'.decode(sys.stdin.encoding)
u'\xaa\xbb\xcc'
所以,
'\xaa\xbb\xcc'
文字只有在您将其解码为 latin-1 文字时才有意义(好吧,实际上您可以使用与相关字符上的 latin-1 一致的不同编码)。至于print
在你的情况下“只是工作”,它当然不适合我 - 如上所述。这是由以下事实解释的:当您使用不以
u
为前缀的字符串文字时-- 即 "asdf"
而不是 u"asdf"
-- 生成的字符串将使用一些非 unicode 编码。不;事实上,字符串对象本身将不知道编码,并且您将不得不将其视为使用编码 x 进行编码,以获得正确的 x 值。这个基本思想使我得出以下结论:a = '\xAA\xBB\xCC'
a.decode('latin1')
# result: u'\xAA\xBB\xCC'
print(a.decode('latin1'))
# output: ª»Ì
注意没有解码错误和正确的输出(我希望在任何其他盒子上都保持正确)。显然,Python 可以理解您的字符串文字,但并非没有帮助。
这有帮助吗? (至少在理解事情是如何工作的,如果不是让编码的处理变得更容易的话......)
现在有一些有趣的部分具有一些解释值(value)(希望如此)!这对我来说很好用:
sys.stdout.write("\xAA\xBB\xCC".decode('latin1').encode(sys.stdout.encoding))
跳过解码或编码部分会导致与 unicode 相关的异常。从理论上讲,这是有道理的,因为需要第一个解码来决定给定字符串中有哪些字符(第一眼看到的唯一明显的是有哪些字节——Python 3 的想法是为字符提供(unicode)字符串和字节,嗯,字节,突然看起来非常合理),而需要编码,以便输出尊重输出流的编码。现在这个
sys.stdout.write("ąöî\n".decode(sys.stdin.encoding).encode(sys.stdout.encoding))
也按预期工作,但字符实际上来自键盘,因此实际上是用 stdin 编码进行编码的......另外,
ord('ą'.decode('utf-8').encode('latin2'))
返回正确的 177(我的输入编码是 utf-8),但是 '\xc4\x85'.encode('latin2') 对 Python 没有意义,因为它不知道如何理解 '\xc4\x85' 和数字,尝试'ascii' 代码是它可以做的最好的。
原答案:
The relevant bit Python 文档(版本 2.6.4)说
print(obj)
是为了打印出 str(obj)
给出的字符串.我想你可以将它包装在对 unicode
的调用中。 (如 unicode(str(obj))
)得到一个 unicode 字符串——或者你可以只使用 Python 3 并将这个特殊的麻烦交换为几个不同的。 ;-)顺便说一句,这表明您可以操纵
print
的结果。就像您可以操作调用 str
的结果一样操作对象在一个对象上,这是通过弄乱 __str__
方法。例子:class Foo(object):
def __str__(self):
return "I'm a Foo!"
print Foo()
至于
print
的实际执行情况,我希望这根本没有用,但如果你真的想知道发生了什么......它在文件 Python/bltinmodule.c
中在 Python 源代码中(我正在查看 2.6.4 版)。搜索以 builtin_print
开头的行.它实际上完全简单,没有魔法在那里发生。 :-)希望这能回答您的问题...但是如果您确实有我完全遗漏的更神秘的问题,请发表评论,我会再次尝试。另外,我假设我们正在处理 Python 2.x;否则我想我不会有有用的评论。
关于python - python print() 函数实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1979234/