python - python print() 函数实际上做了什么?

标签 python unicode printing python-2.x

我在看这个question并开始想知道 print 是什么意思实际上做。

我一直不知道如何使用string.decode()string.encode()在 python 交互式 shell 中以与打印相同的格式获取 unicode 字符串“out”。无论我做什么,我都会得到

  • UnicodeEncodeError 或
  • 带有“\x##”符号的转义字符串...

  • 这是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/

    相关文章:

    python - 两个日期之间的日期数

    python - python 从 stdin 读取的行长度

    Unicode:代码点 127 以上的英文字符

    python json转储unicode错误

    php - 保证动态生成的 html 页面的打印尺寸/布局

    Java 与 C 简单性能测试

    python - 这个奇怪的 python 装饰器是如何工作的

    python - 数据可视化: Matplotlib and Numpy throwing value error

    php - 基于 C++ 代码在 PHP 中创建字节数据并将其传递到套接字

    css - css中使用选择器过滤掉某些元素