如何将字符串中的文字转义序列转换为相应的字节?

时间:2017-01-09 16:46:48

标签: python python-3.x encoding

我有一个UTF-8编码的字符串来自其他包含字符\xc3\x85lesund的字符串(字面反斜杠,字面值" x",字面值" c"等等)。

打印输出以下内容:

\xc3\x85lesund

我想将其转换为字节变量:

b'\xc3\x85lesund'

能够编码:

'Ålesund'

我该怎么做?我使用的是python 3.4。

1 个答案:

答案 0 :(得分:4)

使用unicode_escape

TL; DR 您可以使用unicode_escape编码对字节进行解码,以将\xXX\uXXXX转义序列转换为相应的字符:

>>> r'\xc3\x85lesund'.encode('utf-8').decode('unicode_escape').encode('latin-1')
b'\xc3\x85lesund'

首先,将字符串编码为字节,以便解码:

>>> r'\xc3\x85あ'.encode('utf-8')
b'\\xc3\\x85\xe3\x81\x82'

(我更改了字符串,表明即使对于Latin-1之外的字符,此过程仍然有效。)

以下是每个字符的编码方式(注意あ被编码为多个字节):

  • \(U + 005C) - > 0x5c
  • x(U + 0078) - > 0x78
  • c(U + 0063) - > 0x63
  • 3(U + 0033) - > 0x33
  • \(U + 005C) - > 0x5c
  • x(U + 0078) - > 0x78
  • 8(U + 0038) - > 0x38
  • 5(U + 0035) - > 0x35
  • (U + 3042) - > 0xe3,0x81,0x82

接下来,将字节解码为unicode_escape,将每个转义序列替换为其对应的字符:

>>> r'\xc3\x85あ'.encode('utf-8').decode('unicode_escape')
'Ã\x85ã\x81\x82'

每个转义序列都转换为单独的字符;不属于转义序列的每个字节都将转换为具有相应序数值的字符:

  • \\xc3 - > U + 00C3
  • \\x85 - > U + 0085
  • \xe3 - > U + 00E3
  • \x81 - > U + 0081
  • \x82 - > U + 0082

最后,再次将字符串编码为字节:

>>> r'\xc3\x85あ'.encode('utf-8').decode('unicode_escape').encode('latin-1')
b'\xc3\x85\xe3\x81\x82'

编码为Latin-1只是将每个字符转换为其序数值:

  • U + 00C3 - > 0xc3
  • U + 0085 - > 0x85
  • U + 00E3 - > 0xe3
  • U + 0081 - > 0×81
  • U + 0082 - >为0x82

瞧,我们有你正在寻找的字节序列。

使用codecs.escape_decode

作为替代方案,您可以使用codecs.escape_decode方法将user19087中发布的an answer转换为字节到字节的转换,以解释类似的问题:

>>> import codecs
>>> codecs.escape_decode(r'\xc3\x85lesund'.encode('utf-8'))[0]
b'\xc3\x85lesund'

但是,codecs.escape_decode没有记录,因此我不建议使用它。