我有这个问题,但我无法解决它。我有这个字符串:
data = '\xc4\xb7\x86\x17\xcd'
当我尝试对其进行编码时:
data.encode()
我得到了这个结果:
b'\xc3\x84\xc2\xb7\xc2\x86\x17\xc3\x8d'
我只想要:
b'\xc4\xb7\x86\x17\xcd'
有人知道这是什么原因,以及如何修复吗?该字符串已经存储在一个变量中,所以我无法在其前面添加文字b。
我有这个问题,但我无法解决它。我有这个字符串:
data = '\xc4\xb7\x86\x17\xcd'
当我尝试对其进行编码时:
data.encode()
我得到了这个结果:
b'\xc3\x84\xc2\xb7\xc2\x86\x17\xc3\x8d'
我只想要:
b'\xc4\xb7\x86\x17\xcd'
有人知道这是什么原因,以及如何修复吗?该字符串已经存储在一个变量中,所以我无法在其前面添加文字b。
'\xc4\xb7\x86\x17\xcd'
,查看这些字符表示的Unicode码点。例如,\xc4
是LATIN CAPITAL LETTER A WITH DIAERESIS
,即Ä
。该字符在UTF-8中的编码为0xC3 0x84
,这就解释了为什么将其编码为字节时会得到这个结果。但它在UTF-16中的编码也可以是0x00C4
。
raw_unicode_escape
编解码器:
raw_unicode_escape
具有
\uXXXX
和其他代码点的\UXXXXXXXX
的Latin-1编码。现有的反斜杠不会以任何方式被转义。它在Python pickle协议中使用。
所以这只是一个Latin-1编码,它内置了用于处理超出范围字符的回退机制。我认为这种回退机制对您的目的有些不利。对于不能表示为\xXX
序列的Unicode字符,这可能会有问题:
>>> chr(256).encode('raw_unicode_escape')
b'\\u0100'
raw_unicode_escape
编码返回字符串'\\u0100'
的编码字节,将该字符转换为6个字节,与原始字符几乎没有关系(因为它是转义序列)。如果您想在此处使用Latin-1,则建议您明确使用它,而不是从raw_unicode_escape
中回退到该转义序列。这将在尝试转换Latin-1区域之外的代码点时引发异常。>>> '\xc4\xb7\x86\x17\xcd'.encode('latin1')
b'\xc4\xb7\x86\x17\xcd'
>>> chr(256).encode('latin1')
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
chr(256).encode('latin1')
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0100' in position 0: ordinal not in range(256)
当然,代码点是否在Latin-1范围之外对您是否会造成问题取决于该字符串实际来自何处。但是,如果您可以保证输入仅包含有效的Latin-1字符,则很有可能您根本不需要首先使用字符串。由于您实际上正在处理某种字节,因此应查看是否可以将这些值作为字节检索。这样,您就不会引入两个编码级别,在那里您可能通过错误解释输入而破坏数据。
'raw_unicode_escape'
作为您的编码方式:In [14]: bytes(data, 'raw_unicode_escape')
Out[14]: b'\xc4\xb7\x86\x17\xcd'
正如在评论中提到的那样,您也可以直接将编码传递给字符串的encode
方法。
In [15]: data.encode("raw_unicode_escape")
Out[15]: b'\xc4\xb7\x86\x17\xcd'