Python3将字符串更改为字节

时间:2016-09-18 04:53:57

标签: python unicode utf-8

我正在使用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'

如何处理?

2 个答案:

答案 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'