我有一个UTF-8编码的字符串来自其他包含字符\xc3\x85lesund
的字符串(字面反斜杠,字面值" x",字面值" c"等等)。
打印输出以下内容:
\xc3\x85lesund
我想将其转换为字节变量:
b'\xc3\x85lesund'
能够编码:
'Ålesund'
我该怎么做?我使用的是python 3.4。
答案 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只是将每个字符转换为其序数值:
瞧,我们有你正在寻找的字节序列。
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
没有记录,因此我不建议使用它。