ava*_*989 5 python string byte python-3.x
我有这个问题,我无法弄清楚如何解决它.我有这个字符串:
data = '\xc4\xb7\x86\x17\xcd'
Run Code Online (Sandbox Code Playgroud)
当我尝试编码时:
data.encode()
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
b'\xc3\x84\xc2\xb7\xc2\x86\x17\xc3\x8d'
Run Code Online (Sandbox Code Playgroud)
我只想要:
b'\xc4\xb7\x86\x17\xcd'
Run Code Online (Sandbox Code Playgroud)
任何人都知道原因以及如何解决这个问题.该字符串已存储在变量中,因此我无法在其前面添加文字b.
pok*_*oke 11
如果不考虑编码,则无法将字符串转换为字节或字节为字符串.关于bytes类型的整点是与编码无关的字节序列,str而是一系列Unicode代码点,它们在设计上没有唯一的字节表示.
因此,当您想要将一个转换为另一个时,您必须明确告知要使用哪种编码来执行此转换.转换为字节时,您必须说明如何将每个字符表示为字节序列; 当你从字节转换时,你必须说明用什么方法将这些字节映射到字符.
如果没有指定编码,那么UTF-8是默认的,这是因为UTF-8是无处不在一个健全的默认,但它也只是一个许多有效编码.
如果您使用原始字符串,'\xc4\xb7\x86\x17\xcd'请查看这些字符所代表的Unicode代码点.\xc4例如是LATIN CAPITAL LETTER A WITH DIAERESIS,即Ä.该字符碰巧以UTF-8编码,0xC3 0x84这解释了为什么这是你将其编码为字节时得到的.但它也有一个0x00C4UTF-16 的编码.
至于如何正确解决这个问题,以便获得所需的输出,没有明确的正确答案.Kasramvd提到的解决方案也有些不完美.如果您阅读文档中的raw_unicode_escape编解码器:
raw_unicode_escape带有
\uXXXX和\UXXXXXXXX用于其他代码点的Latin-1编码.现有的反斜杠不会以任何方式转义.它用于Python pickle协议.
所以这只是一个Latin-1编码,它有一个内置的回退字符.我认为这种后备对你的目的有些害处.对于无法表示为\xXX序列的Unicode字符,这可能会有问题:
>>> chr(256).encode('raw_unicode_escape')
b'\\u0100'
Run Code Online (Sandbox Code Playgroud)
因此,代码点256 明确地在 Latin-1 之外,这导致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)
Run Code Online (Sandbox Code Playgroud)
当然,Latin-1区域之外的代码点是否会导致问题取决于字符串实际来自哪里.但是如果你能保证输入只包含有效的Latin-1字符,那么你可能不需要首先使用字符串.由于您实际上正在处理某种字节,因此您应该首先查看是否不能简单地将这些值作为字节检索.这样,你就不会引进2个,你可以通过曲解输入错误数据编码的水平在那里.
您可以使用'raw_unicode_escape'作为您的编码:
In [14]: bytes(data, 'raw_unicode_escape')
Out[14]: b'\xc4\xb7\x86\x17\xcd'
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的,您还可以将编码直接传递给encode字符串的方法。
In [15]: data.encode("raw_unicode_escape")
Out[15]: b'\xc4\xb7\x86\x17\xcd'
Run Code Online (Sandbox Code Playgroud)