【问题标题】:Printing non-ASCII characters in python3在 python3 中打印非 ASCII 字符
【发布时间】:2021-05-21 07:35:23
【问题描述】:

python2 和 python3 处理字符串的方式和字节不同,因此在 Python3 中打印包含非 ASCII 字符的十六进制字符串与 Python2 不同。

为什么会发生这种情况,我怎么能像 Python2 那样在 Python3 中打印一些东西? (使用 ASCII 字符或 UTF-8 解码字节字符串时效果很好)

Python3:

$ python3 -c 'print("\x41\xb3\xde\x41\x42\x43\xad\xde")' |xxd -p
41c2b3c39e414243c2adc39e0a

Python2:

$ python2 -c 'print "\x41\xb3\xde\x41\x42\x43\xad\xde"' |xxd -p
41b3de414243adde0a

\x0a 是 newline 因为 print 添加了它。

如何在 python3 中打印“\xb3”?它添加了“\xc2\xb3”,而只是添加了“\xb3”。

$ python3 -c 'print("\xb3")' |xxd
00000000: c2b3 0a                                  ...
$ python2 -c 'print "\xb3"' |xxd
00000000: b30a                                     ..

【问题讨论】:

  • 您能说明一下您到底想要达到什么目标吗?您想写入没有任何(内部和外部)编码的原始字节吗?
  • 是的,我想像 Python2 一样使用 Python3 进行打印。使用 Python3 我无法打印“\xb3”,Python3 打印“\xc2\xb3”,我只想打印“\xb3”。我已将此示例添加到问题中。
  • 不要太迂腐,但你知道Python2和Python3中的"\xb3"不一样吗?与 Python3 中的 Python2 相同的关闭是 b"\xb3"。所以问题“我如何在 Python3 中像在 Python2 中一样将"\xb3" 写入标准输出”和“如何在 Python3 中将字节值 0xb3 写入标准输出”是两个不同的问题。简而言之,您是否已经有了字符串文字并想写它,或者您是否有字节值并想写它?
  • 是的,我知道在 Python3 中是 b"\xb3";这就是问题所在;我怎么能打印 b"\xb3";如果我做 bytes.fromhex("41b3de414243adde0a") 我得到 b'A\xb3\xdeABC\xad\xde\n' 没关系;但是当我打印时它添加了“\xc2\xb3”。就是那个问题。你不是迂腐的,别担心。我们在互联网上。
  • 更多信息:要打印它,我尝试使用 utf-8 并忽略,替换。我也尝试过 latin_1。在问这里之前我看过docs.python.org/3/library/codecs.html

标签: python python-3.x


【解决方案1】:

潜在的问题是,在 Python3 中 str 用于 编码 字符串,同样 print 仅处理 str,因此总是强制执行一些编码。

要写入二进制数据,直接将bytes写入stdout的底层二进制管道:

python3 -c 'import sys; sys.stdout.buffer.write(b"\x41\xb3\xde\x41\x42\x43\xad\xde")' | xxd -p
41b3de414243adde

请注意,最后的 0a 丢失了,因为 .write 没有添加换行符。如果需要,请手动添加。

如果数据已经作为字符串存在,则可以使用latin1 编码来获取等效字节:

python3 -c '
import sys
sys.stdout.buffer.write("\x41\xb3\xde\x41\x42\x43\xad\xde".encode("latin1"))' | xxd -p
41b3de414243adde

【讨论】:

    【解决方案2】:

    我不确定这是否会对您的情况有所帮助,但您可以使用 sys.stdout.buffer:

    注意

    要从/向标准流写入或读取二进制数据,请使用 底层二进制缓冲区对象。例如,将字节写入 标准输出,使用 sys.stdout.buffer.write(b'abc')。

    $ python3 -c 'import sys; sys.stdout.buffer.write(b"\x41\xb3\xde\x41\x42\x43\xad\xde")' | hexdump -C
    00000000  41 b3 de 41 42 43 ad de                           |A..ABC..|
    00000008
    

    还请注意,print 函数现在没有添加换行符。

    【讨论】:

    • 当然。这就是解决方案。
    猜你喜欢
    • 2013-11-19
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2012-10-14
    • 2016-12-25
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多