python3 str到字节的转换问题

问题描述

在 python 3.8.5 中,我尝试将一些字节转换为字符串,然后将字符串转换为字节:

>>> a=chr(128)
>>> a
'\x80'
>>> type(a)
<class 'str'>

但是当我尝试进行反向转换时:

>>> a.encode()
b'\xc2\x80'       

什么是\xc2 字节?为什么会出现? 感谢您的回复

解决方法

这是一个 UTF-8 编码,所以 \xc2 来自这里,看看 here

在 Python 字符串中,\x80 表示 Unicode codepoint #128(填充字符)。当我们用 UTF-8 编码该代码点时,它需要两个字节。

最初的 ASCII 编码只有 128 个不同的字符,Unicode 码位有数千个,单个字节只能表示 256 个不同的值。很多计算都基于 ASCII,我们希望这些东西继续工作,但我们需要非英语人士也能使用计算机,所以我们需要能够表示他们的字符。

答案是 UTF-8,一种将前 128 个 Unicode 代码点(0-127,ASCII 字符)编码为单个字节的方案——因此仅使用这些字符的文本与 ASCII 完全兼容。接下来的 1920 个字符,包含最常见的非英语字符(U+80 到 U+7FF),分布在两个字节中。

因此,作为对一些适合单字节编码(例如 \x80)的字符效率稍低的交换,我们获得了表示每种书面语言中的每个字符的能力。

要阅读更多内容,请尝试SO question

例如,如果您想删除 \xc2,请尝试将您的字符串编码为 latin-1

a=chr(128)
print(a)

#'\x80'

print(a.encode())

#b'\xc2\x80'

a.encode('latin-1')

#b'\x80'