python - String to Bytes Python 不改变编码

标签 python string python-3.x byte

我遇到了这个问题,但我不知道如何解决。我有这个字符串:

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。

最佳答案

如果不考虑编码,您不能将字符串转换为字节或将字节转换为字符串。bytes 类型的重点是一个与编码无关的字节序列,而 str 是一个 Unicode code points 序列。 设计没有唯一的字节表示。

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

如果不指定编码,则UTF-8是默认值,这是一个明智的默认值,因为 UTF-8 无处不在,但它也只是许多有效编码中的一个

如果您使用原始字符串 '\xc4\xb7\x86\x17\xcd',请查看这些字符代表的 Unicode 代码点。 \xc4 例如是 LATIN CAPITAL LETTER A WITH DIAERESIS ,即 Ä。该字符恰好在 UTF-8 中编码为 0xC3 0x84,这解释了为什么将其编码为字节时会得到这样的结果。但它也有 0x00C4 编码,例如 UTF-16。


至于如何正确地解决这个问题,从而得到想要的输出,目前还没有明确的正确答案。 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 明确地在 Latin-1 之外,这导致 raw_unicode_escape 编码返回字符串 '\\u0100 的编码字节',将那个字符转换为与原始字符无关的 6 个字节(因为它是一个转义序列)。

因此,如果您想在这里使用 Latin-1,我建议您明确使用 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 字符,那么您很可能一开始就不需要在那里使用字符串。由于您实际上是在处理某种类型的字节,因此您应该看看是否不能首先简单地将这些值作为字节检索。这样您就不会引入级别的编码,在那里您可以通过误解输入来破坏数据。

关于python - String to Bytes Python 不改变编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48367128/

相关文章:

javascript - 从 javascript 中函数的属性返回串联字符串

python-3.x - Django : Error trying to save form

python-3.x - 在 Web 应用程序中转换 Jupyter notebook 代码的最佳方式

python - 在Python中迭代字典值

Python - BaseHTTPServer do_GET() - wfile.write(filedata) 损坏的管道

python - 查找图像中太细但不是尖形末端的区域

python - 根据它们在 python 中的性质,将字符串转换为 float 或整数

python - Python中的 block 范围

python - tensorflow : "logits and labels must be the same size"

javascript - 如何将Set转换为带空格的字符串?