【问题标题】:Single byte (\xd0) gets printed as sequence of two bytes (\xc3\x90) in Python 3 [duplicate]单字节 (\xd0) 在 Python 3 中打印为两个字节的序列 (\xc3\x90) [重复]
【发布时间】:2019-03-30 00:11:27
【问题描述】:

我正在尝试在 Python 3.7.2 中将字节 d0 打印到标准输出。我有以下代码:

print("\xd0", end = "")

但是,当我执行此操作时,它会输出字节 c390

$ python -c 'print("\xd0", end = "")' | xxd    
00000000: c3 90

为什么不输出字节\xd0

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    "\xd0" 是一个 str 对象,在 Python 3 中它是一个 Unicode 字符串(= Unicode 代码点 的序列),其中包含 Unicode 代码点 U+00D0(即 208 即 Ð);当使用print 编写它时,Python 必须将其从 Unicode (str) 转换为字节 (bytes),因此它必须使用 encoding(将“抽象代码点”转换为字节转换器)。

    在您的情况下,通常它恰好是 UTF-8,其中代码点 U+00D0 被编码为代码单元(= 字节)序列 c3 90。

    如果你想按字面意思输出一个字节 0xd0,你必须使用一个字节串并直接进入sys.stdout之外的字节流:

    import sys
    sys.stdout.buffer.write(b'\xd0')
    

    【讨论】:

    • 天哪,这很有意义。这个问题让我困惑了几个小时,其他时候我没有把它缩小到 Python。非常感谢。有没有更笼统的东西我可以命名这个问题,因为这不仅适用于您能想到的d0 字节?
    • @Arin:很高兴它有帮助! :-) 至于问题标题,我不知道,也许“单个字符(\xd0)被打印为两个字符的序列(\xc3\x90)”或类似的东西?
    【解决方案2】:

    它将字符 U+00D0(“Д)打印为 UTF-8。如果你想输出一个字节串到标准输出,使用sys.stdout.buffer:

    import sys
    sys.stdout.buffer.write(b"\xd0")
    

    "\xd0" 是一串 Unicode 码位,但 b"\xd0" 是一串字节。

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 2022-04-25
      • 1970-01-01
      • 2017-04-10
      • 2021-07-05
      相关资源
      最近更新 更多