【问题标题】:Does python automatically decode ASCII and UTF-8 byte strings? [duplicate]python 会自动解码 ASCII 和 UTF-8 字节字符串吗? [复制]
【发布时间】:2019-08-24 15:28:02
【问题描述】:

据我了解,Python3 字符串是经过解码以供人类阅读的字节序列,而 Python3 字节对象是人类不可读的原始字节。然而,我难以理解的是,用 UTF-8 或 ASCII 编码的字符串如何显示为以 b 为前缀的字符串,而不是字节序列

string = "I am a string"

# prints a sequence of bytes, like I would expect
string.encode("UTF-16")
b'\xff\xfeI\x00 \x00a\x00m\x00 \x00a\x00 \x00s\x00t\x00r\x00i\x00n\x00g\x00'


# Prints a sequence of human readable characters, which I don't understand
string.encode("UTF-8")
b'I am a string'

为什么 UTF-8 或 ASCII 编码的字符串不显示字节序列?

【问题讨论】:

  • "为什么 UTF-8 或 ASCII 编码的字符串不显示字节序列?" - 提示在问题中。 “显示”的内容 HAS 是一种设计选择,那么,您是否愿意将字节字符串视为我们可以理解的数字或字节字符串。 :P

标签: python byte


【解决方案1】:

UTF-8 是向后兼容的 ASCII 超集,即任何有效的 ASCII 都是有效的 UTF-8,并且 ASCII 中的所有内容都由 UTF-8 编码,使用与 ASCII 相同的字节。因此,与其说是“UTF-8 或 ASCII”,不如说是“只是一些 ASCII”。尝试其他 Unicode:

>>> "café".encode("UTF-8")
b'caf\xc3\xa9'

或其他不利于以字符形式查看的 ASCII:

>>> "hello\f\n\t\r\v\0\N{SOH}\N{DEL}".encode("UTF-8")
b'hello\x0c\n\t\r\x0b\x00\x01\x7f'

bytesrepr 显示可打印字符而不是 \xnn 尽可能转义的原因是,如果您碰巧有包含 ASCII 的字节,它会很有帮助。

当然,它仍然是格式良好的bytes 字面量:

>>> b'I am a string'[0]
73

另外:来自docs

虽然字节文字和表示基于 ASCII 文本, bytes 对象实际上表现得像不可变的整数序列, 序列中的每个值都受到限制,使得 0

-添加了重点。

归根结底,这是 python 为显示字节所做的设计选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多