【问题标题】:Bytes operations in PythonPython中的字节操作
【发布时间】:2020-03-21 22:34:15
【问题描述】:

我正在做一个项目,在这个项目中我必须使用 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" 。这是什么意思?这应该出现吗?如果是这样,如果不使用第一种方法,我怎样才能摆脱它?

【问题讨论】:

  • b 不是字符。它是字节文字的一部分。
  • this 问题可能重复。欢迎来到 StackOverflow。一些 unicode 代码点长两个字节,如果使用 utf-8 编码,则打印两个字节。

标签: python python-3.x byte decode encode


【解决方案1】:

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

特别是,字节 172 不编码任何东西,特别是 unicode。另一方面,unicode 代码点 172 指的是以下字符:

>>> c = chr(172)
>>> print(c)
¬

当然,它们对应的实际原始字节取决于编码。使用 utf-8 是两字节编码:

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

在latin-1编码中,是一个1字节:

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

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

【讨论】:

  • 非常感谢您的快速回答,还有一件事:就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".encode("latin")正确吗?
  • @MarcoBorinato 没有,但如果你的意思是一般来说,我不能说 100%,但我相信,基本上,Unicode 的前 256 个代码点在设计上等同于拉丁语.为什么要问?
  • 因为它们的行为方式不同,或者至少不是我所期望的方式。我已经发布了另一个问题,因为主题略有不同,如果您也能帮助解决这个问题,我将不胜感激。链接如下:stackoverflow.com/questions/60811088/…
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-10-14
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多