【问题标题】:Python3 change string to bytePython3将字符串更改为字节
【发布时间】:2016-09-18 04:53:56
【问题描述】:

我用的是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'

如何处理?

【问题讨论】:

  • 看起来该字符串在进入您的代码之前应该是一个字节串。什么库/接口给你?

标签: python unicode utf-8


【解决方案1】:

使用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'
>>> 

当然,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'
>>> 

当然,选择对您的意图最有意义的策略。

【讨论】:

  • @Loïc 遗留原因,但我想我会在编辑解释之前立即发布答案,我必须在 wiki 上进行解释,因为我真的没有头脑中的所有各种背景。跨度>
  • 感谢您的回答和解释。
  • @DaChen 不客气,我很惊讶以前没有问过这个问题,因为我似乎找不到专门针对 Python 3 和字符串转换为相同的问题的合适重复条目原始字节序列(他们都在谈论实际编码,但不是在字节级别)。
【解决方案2】:

您可以尝试各种编码,看看是否符合您的要求。

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'

【讨论】:

  • 这是一个非常有用的方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多