至于如何正确地解决这个问题,从而得到所需的输出,没有明确的正确答案。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.
>>> '\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)
您可以使用
'raw_unicode_escape'
作为编码:如注释中所述,您还可以将编码直接传递给字符串的
encode
方法。如果不考虑编码,则不能将字符串转换为字节或将字节转换为字符串。关于
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:所以这只是一个Latin-1 encoding,它有一个内置的回退,用于外部字符。我认为这种退避对你的目的有点有害。对于不能表示为
\xXX
序列的Unicode字符,这可能有问题:因此,代码点256在拉丁语1的之外显式地是,这会导致
raw_unicode_escape
编码返回字符串'\\u0100'
的编码字节,从而将该字符转换为与原始字符几乎无关的6个字节(因为它是转义序列)。所以,如果你想在这里使用拉丁语-1,我建议你明确地使用它,而不是让转义序列从
raw_unicode_escape
后退。这只会在尝试转换Latin-1区域以外的代码点时导致异常:当然,Latin-1区域之外的代码点是否会给您带来问题,取决于该字符串的实际来源。但是,如果您可以保证输入将只包含有效的拉丁1字符,那么您可能不需要首先使用字符串。因为您实际上是在处理某种类型的字节,所以您应该首先检查是否不能简单地将这些值作为字节检索。这样你就不会引入两个级别的编码,在那里你可以通过曲解输入来破坏数据。
相关问题 更多 >
编程相关推荐