我正在使用Python3.5,我想将\xe1BA\x06\xbe\x084
更改为b'\xe1BA\x06\xbe\x084'
但使用'\xe1BA\x06\xbe\x084'.encode('ascii')
或'\xe1BA\x06\xbe\x084'.encode('utf-8')
不起作用。
在.encode('utf-8')
中,它将成为
b'\xc3\xa1BA\x06\xc2\xbe\x084'
与
不同
b'\xe1BA\x06\xbe\x084'
如何处理?
答案 0 :(得分:4)
使用latin1
编解码器。
>>> '\xe1BA\x06\xbe\x084'.encode('latin1')
b'\xe1BA\x06\xbe\x084'
之所以能够工作(并且就是它的方式)是因为最初这些字节序列被ISO-8859-1 standard定义为那些字符,因此使用该编码很好地对它们进行编码,让你回到那些确切的字节。
虽然另一个答案很有用(循环通过所有可用的编解码器来获得所有可能的输出很棒),但请记住,虽然其他特定编解码器适用于某些特定字符串,但它可能会或可能不会映射到相同的基数"字节"序列
>>> '\xfe'.encode('iso8859_9')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/encodings/iso8859_9.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character '\xfe' in position 0: character maps to <undefined>
>>> '\xfe'.encode('latin1')
b'\xfe'
>>>
当然,如果您的意图是将所有内容编码为一种基本字节编码形式,同时允许任何内容&gt;,raw_unicode_escape
会很有用。 \xff
通过\\uXXXX
表单代表:
>>> 'あ'.encode('latin1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode character '\u3042' in position 0: ordinal not in range(256)
>>> 'あ'.encode('raw_unicode_escape')
b'\\u3042'
>>>
当然,选择对你的意图最有意义的策略。
答案 1 :(得分:1)
您可以尝试所有类型的编码,看它是否符合您的要求。
s = '\xe1BA\x06\xbe\x084'
code_list = ["ascii", "big5", "big5hkscs", "cp037", "cp424", "cp437", "cp500",
"cp720", "cp737", "cp775", "cp850", "cp852", "cp855", "cp856", "cp857", "cp858",
"cp860", "cp861", "cp862", "cp863", "cp864", "cp865", "cp866", "cp869", "cp874",
"cp875", "cp932", "cp949", "cp950", "cp1006", "cp1026", "cp1140", "cp1250", "cp1251",
"cp1252", "cp1253", "cp1254", "cp1255", "cp1256", "cp1257", "cp1258", "euc_jp",
"euc_jis_2004", "euc_jisx0213", "euc_kr", "gb2312", "gbk", "gb18030", "hz", "iso2022_jp",
"iso2022_jp_1", "iso2022_jp_2", "iso2022_jp_2004", "iso2022_jp_3", "iso2022_jp_ext",
"iso2022_kr", "latin_1", "iso8859_2", "iso8859_3", "iso8859_4", "iso8859_5", "iso8859_6",
"iso8859_7", "iso8859_8", "iso8859_9", "iso8859_10", "iso8859_13", "iso8859_14",
"iso8859_15", "iso8859_16", "johab", "koi8_r", "koi8_u", "mac_cyrillic", "mac_greek",
"mac_iceland", "mac_latin2", "mac_roman", "mac_turkish", "ptcp154", "shift_jis",
"shift_jis_2004", "shift_jisx0213", "utf_32", "utf_32_be", "utf_32_le", "utf_16",
"utf_16_be", "utf_16_le", "utf_7", "utf_8", "utf_8_sig", "idna", "mbcs", "palmos",
"punycode", "raw_unicode_escape", "rot_13", "undefined", "unicode_escape",
"base64_codec", "bz2_codec", "hex_codec", "quopri_codec",
"string_escape"]
for i in code_list:
try:
if s.encode(i) == b'\xe1BA\x06\xbe\x084':
print('**{:>20}** ==> {}'.format(i, s.encode(i)))
except Exception as e:
pass
结果:
** cp1252** ==> b'\xe1BA\x06\xbe\x084'
** cp1254** ==> b'\xe1BA\x06\xbe\x084'
** cp1258** ==> b'\xe1BA\x06\xbe\x084'
** latin_1** ==> b'\xe1BA\x06\xbe\x084'
** iso8859_9** ==> b'\xe1BA\x06\xbe\x084'
** palmos** ==> b'\xe1BA\x06\xbe\x084'
** raw_unicode_escape** ==> b'\xe1BA\x06\xbe\x084'