【问题标题】:python randomly adds bytes to a string when encoding to utf-8python在编码为utf-8时随机将字节添加到字符串中
【发布时间】:2021-11-13 17:11:19
【问题描述】:

我正在尝试编写一个函数,该函数采用十进制并将其以相反的顺序转换为十六进制转义序列。我编写的代码适用于大多数数字,例如示例中的代码,但是随机地,它在开头添加了一个额外的字节 \xC2 或 \xC3。我认为这是因为 utf-8 的工作方式有一种特殊的方式,但需要它恰好有 4 个字节。从测试来看,它似乎每隔 128 个数字发生一次,它从该部分的半点开始切换到 \xC3

我可以系统地删除添加的额外字节,但这似乎是随机的,必须有更好的方法来做到这一点那么这个随机额外字节背后的原因是什么以及我如何防止它发生,或者我应该系统地删除它吗

这是我写的函数:

def convert_int_to_reverse_hex_escape_sequence(decimal):
    # example of the variable in comments                               # decimal = 275
    hexadecimal = hex(decimal)                                          # 0x113
    padded = hexadecimal[2:].zfill(8)                                   # 00000113
    array = re.findall('..', padded)                                    # ['00', '00', '01', '13']
    array.reverse()                                                     # ['13', '01', '00', '00']
    unicode = ''.join([chr(int(x, 16)) for x in array]).encode('utf-8') # b'\x13\x01\x00\x00'
    return unicode

【问题讨论】:

  • import struct; struct.pack('<i', 275) 与您的功能几乎相同?
  • 哪个数字不能正常工作?
  • 顺便说一句,您不需要转换为十六进制,只需提取字节即可。 (模块256或带移位功能)。但问题是:代码从 0 到 127 的字符被编码为从 0 到 127 的字节。但是代码点高于 127 的字符以 2(或更多字节)的 unicode 编码。你应该关心语义(Unicode 是关于给代码点(索引)赋予意义)。
  • 你绕了一大圈。但是,如果您使用 'latin-1' 而不是 'utf-8' 进行编码,则可以使其正常工作。

标签: python utf-8


【解决方案1】:

UTF-8 将任何 >128 (0x7F) 的 Unicode 代码点编码为两个或更多字节,因此当 chr(x,16) 的结果为 >128 时,您将看到您的问题:

>>> ''.join(chr(int(x,16)) for x in ['80','90','A0','B0']).encode('utf8')
b'\xc2\x80\xc2\x90\xc2\xa0\xc2\xb0'

latin1 会做你想做的事,因为它将字符 0-255 以 1:1 的比例转换为字节 0-255:

>>> ''.join(chr(int(x,16)) for x in ['80','90','A0','B0']).encode('latin1')
b'\x80\x90\xa0\xb0'

但是有一个适用于您的用例的内置函数。告诉它你想要多少字节以及小端或大端:

>>> x = 275
>>> x.to_bytes(4,'little')
b'\x13\x01\x00\x00'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2010-12-01
    • 2011-08-16
    • 2014-03-07
    • 2015-07-01
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多