我有一个UTF-8编码的字符串,它来自包含字符的其他地方\xc3\x85lesund
(文字反斜杠,文字“ x”,文字“ c”等)。
打印它会输出以下内容:
\xc3\x85lesund
我想将其转换为字节变量:
b'\xc3\x85lesund'
为了能够编码:
'Ålesund'
我怎样才能做到这一点?我正在使用python 3.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-> 0x81
U + 0082-> 0x82
瞧,我们有您要寻找的字节序列。
使用codecs.escape_decode
或者,您可以使用该codecs.escape_decode
方法来解释从字节到字节的转换中的转义序列,如user19087在类似问题的答案中所述:
>>> import codecs >>> codecs.escape_decode(r'\xc3\x85lesund'.encode('utf-8'))[0] b'\xc3\x85lesund'
但是,它codecs.escape_decode
是未记录的,因此我不建议您使用它。