Python中的字节操作

Python中的字节操作,python,python-3.x,byte,decode,encode,Python,Python 3.x,Byte,Decode,Encode,我正在从事一个项目,在这个项目中,我必须使用python执行一些字节操作,在继续之前,我想了解一些基本原理 t1 = b"\xAC\x42\x4C\x45\x54\x43\x48\x49\x4E\x47\x4C\x45\x59" t2 = "\xAC\x42\x4C\x45\x54\x43\x48\x49\x4E\x47\x4C\x45\x59" print("Adding b character before: ",t1) print("Using bytes(str): ",bytes(t2

我正在从事一个项目,在这个项目中,我必须使用python执行一些字节操作,在继续之前,我想了解一些基本原理

t1 = b"\xAC\x42\x4C\x45\x54\x43\x48\x49\x4E\x47\x4C\x45\x59"
t2 = "\xAC\x42\x4C\x45\x54\x43\x48\x49\x4E\x47\x4C\x45\x59"
print("Adding b character before: ",t1)
print("Using bytes(str): ",bytes(t2,"utf-8"))
print("Using str.encode: ",t2.encode())
特别是,我无法理解为什么在运行上述代码时控制台会打印此内容:

C:\Users\Marco\PycharmProjects\codeTest\venv\Scripts\python.exe C:/Users/Marco/PycharmProjects/codeTest/msgPack/temp.py
Adding b character before:  b'\xacBLETCHINGLEY'
Using bytes(str):  b'\xc2\xacBLETCHINGLEY'
Using str.encode:  b'\xc2\xacBLETCHINGLEY'

我想理解的是,如果我使用bytes()或decode,为什么会在值前面有一个额外的“\xc2”。这是什么意思?这个应该出现吗?如果是这样的话,我如何在不使用第一种方法的情况下摆脱它呢?

因为
字节
对象和
str
对象是两种不同的东西。前者表示字节序列,后者表示unicode码点序列。字节172和unicode代码点172之间存在巨大差异

特别是,字节172没有用unicode编码任何特定内容。另一方面,unicode代码点172表示以下字符:

>>> c = chr(172)
>>> print(c)
¬
当然,它们是实际的原始字节,这取决于编码。使用utf-8是一种双字节编码:

>>> c.encode()
b'\xc2\xac'
在拉丁-1编码中,它是一个1字节:

>>> c.encode('latin')
b'\xac'

如果需要原始字节,最精确/简单的方法是使用字节文字。

在字符串文字中,
\xhh
(h为十六进制数字)选择相应的unicode字符
U+0000
U+00FF
,U+00AC为“非符号”。当编码为utf-8时,0x7F以上的所有代码点占用两个或更多字节
\xc2\xac
U+00AC
的utf-8编码

>>> "\u00AC" == "\xAC"
True
>>> "\u00AC" == "¬"
True
>>> "\xAC" == "¬"
True
>>> "\u00AC".encode('utf-8')
b'\xc2\xac'
>>> "¬".encode("utf-8")
b'\xc2\xac'

b
不是字符。它是bytes-literal的一部分。问题可能重复。欢迎来到StackOverflow。一些unicode代码点有两个字节长,如果使用
utf-8
编码,则会打印两个字节。非常感谢您的快速回答,还有一件事:就python而言,这两个变量之间应该没有区别吗?t1=b“\xAC\x42\x4C\x45\x54\x43\x48\x49\x4E\x47\x4C\x45\x59”和t2=“\xAC\x42\x4C\x45\x54\x43\x48\x49\x4E\x47\x4C\x45\x59”。编码(“拉丁语”)正确吗?@Marcoborianto没有,但如果你的意思是一般来说,我不能说100%,但我相信,从本质上讲,Unicode的前256个代码点在设计上等同于拉丁语。你为什么这么问?因为他们的行为方式不同,或者至少不像我想象的那样。我已经发布了另一个问题,因为主题略有不同,如果你也能帮我解决这个问题,我将非常感谢。链接如下: