为什么 Python 会自动将字符串中的十六进制编码为 UTF-8?

she*_*lbc 3 python unicode python-3.x

我一直在使用 python 进行 ascii 到二进制的翻译,并一直遇到解析结果的问题。最终我想看看 Python 命令生成了什么。

0xc2输出中似乎插入了胭脂(例如):

$ python -c 'print("\x80")' | xxd
00000000: c280 0a                                  ...
Run Code Online (Sandbox Code Playgroud)

实际上,无论在哪里使用此类字节都会发生这种情况:

$ python -c 'print("Test\x80Test2\x81")' | xxd
00000000: 5465 7374 c280 5465 7374 32c2 810a       Test..Test2...
Run Code Online (Sandbox Code Playgroud)

凭直觉,我仔细研究了UTF-8,果然,U+0080编码为0xc2 0x80. 显然,Python 冒昧地假设\x80实际上是U+0080. 有没有办法改变这个默认行为或以其他方式明确规定我的意图是包含单字节0x80而不是 UTF 编码?

Python 3.6.2

VPf*_*PfB 5

Python 3 将字符插入到 astr中是正确的事情,它是字符串,而不是字节序列。

UTF8 是默认编码。如果您需要插入一个字节,则需要一种不同的编码,其中该字符表示为一个字节。

$ PYTHONIOENCODING=iso-8859-1 python3 -c 'print("\x80")' | xxd
00000000: 800a
Run Code Online (Sandbox Code Playgroud)

蟒蛇编码

如果在运行解释器之前设置它,它将覆盖用于 stdin/stdout/stderr 的编码,语法为 encodingname:errorhandler。encodingname 和 :errorhandler 部分都是可选的,与 str.encode() 具有相同的含义。

  • 更改字符串的全局编码是对局部问题的(相当不雅的)全局解决方案。如果 OP 正在构建字节序列而不是字符序列,他应该使用 `byte` 对象而不是 `str` 对象(或者,使用 `encode` 方法仅将相关的 `str` 对象编码为 Latin1)。 (2认同)