不改变编码的字符串到字节Python

2024-05-16 09:57:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个问题,我不知道怎么解决。我有这个绳子:

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。


Tags: 方法编码data原因x86encodex17xc4
2条回答

您可以使用'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'

如果不考虑编码,则不能将字符串转换为字节或将字节转换为字符串。关于bytes类型的整点是一个独立于编码的字节序列,而str是一个Unicode code points序列,根据设计,它没有唯一的字节表示。

所以当你想把一个转换成另一个的时候,你必须明确地告诉你想用什么编码来执行这个转换。当转换为字节时,必须说明如何将每个字符表示为字节序列;当从字节转换时,必须说明要使用什么方法将这些字节映射为字符。

如果不指定编码,那么UTF-8是默认值,这是一个合理的默认值,因为UTF-8无处不在,但它也是许多有效编码的之一。

如果使用原始字符串'\xc4\xb7\x86\x17\xcd',请查看这些字符表示的Unicode代码点。\xc4例如是^{},即Ä。这个字符碰巧在UTF-8中被编码为0xC3 0x84,这就解释了为什么把它编码成字节时会得到这样的结果。但它在UTF-16中也有一个0x00C4编码。


至于如何正确地解决这个问题,从而得到所需的输出,没有明确的正确答案。Kasramvd提到的解决方案也有些不完善。如果您阅读了raw_unicode_escape编解码器in the documentation

raw_unicode_escape

Latin-1 encoding with \uXXXX and \UXXXXXXXX for other code points. Existing backslashes are not escaped in any way. It is used in the Python pickle protocol.

所以这只是一个Latin-1 encoding,它有一个内置的回退,用于外部字符。我认为这种退避对你的目的有点有害。对于不能表示为\xXX序列的Unicode字符,这可能有问题:

>>> chr(256).encode('raw_unicode_escape')
b'\\u0100'

因此,代码点256在拉丁语1的之外显式地是,这会导致raw_unicode_escape编码返回字符串'\\u0100'的编码字节,从而将该字符转换为与原始字符几乎无关的6个字节(因为它是转义序列)。

所以,如果你想在这里使用拉丁语-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区域之外的代码点是否会给您带来问题,取决于该字符串的实际来源。但是,如果您可以保证输入将只包含有效的拉丁1字符,那么您可能不需要首先使用字符串。因为您实际上是在处理某种类型的字节,所以您应该首先检查是否不能简单地将这些值作为字节检索。这样你就不会引入两个级别的编码,在那里你可以通过曲解输入来破坏数据。

相关问题 更多 >