2016-09-18 27 views
2

我使用Python3.5,我想改变\xe1BA\x06\xbe\x084b'\xe1BA\x06\xbe\x084'Python3变化串到字节

但使用'\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,因而使用该编码好了,让你回那些编码下来回确切的字节。

尽管其他答案很有用(通过所有可用编解码器获取所有可能的输出的循环很好),但请记住,虽然其他特定的编解码器可以用于某些特定的字符串,但它可能会或可能不会结束映射到相同的基本“字节”序列。

>>> 'あ'.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' 
>>> 

>>> '\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' 
>>> 

当然,如果您的目的是一切编码为基础字节编码的一种形式,也允许任何>\xff通过\\uXXXX形式来表示的raw_unicode_escape可以是有用当然,选择对你的意图最有意义的策略。

+0

这是为什么?你介意解释一下吗? –

+1

@Loïc遗留的原因,但我想我立即发布答案之前,我编辑的解释,我必须维基,因为严重的是我没有在我的脑海中的各种背景。 – metatoaster

+0

感谢您的答复和解释。 –

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' 
+0

这是一个相当有用的方法。谢谢。 –