2016-09-18 2 views
2

Ich verwende Python3.5 und ich möchte \xe1BA\x06\xbe\x084 in b'\xe1BA\x06\xbe\x084'Python3 Änderung String Byte

Aber '\xe1BA\x06\xbe\x084'.encode('ascii') oder '\xe1BA\x06\xbe\x084'.encode('utf-8') funktioniert nicht mit ändern.

In .encode('utf-8'), wird es werden
b'\xc3\xa1BA\x06\xc2\xbe\x084' von
mit diesem b'\xe1BA\x06\xbe\x084'

Wie umgehen unterscheidet?

+0

Es sieht so aus, dass die String Bytestring sein sollte, bevor es zu einem Code erhält. Welche Bibliothek/Schnittstelle gibt es Ihnen? –

Antwort

4

Verwenden Sie den Codec latin1.

>>> '\xe1BA\x06\xbe\x084'.encode('latin1') 
b'\xe1BA\x06\xbe\x084' 

Der Grund, warum das funktioniert (und ist so, wie es ist), weil ursprünglich diese Bytes Sequenzen definiert wurden durch die ISO-8859-1 standard diese Zeichen zu sein, und sie so codiert, wieder nach unten, dass auch Codierung, bekommt man zurück diejenigen, exakte Bytes.

Während die andere Antwort nützlich ist (die Schleife durch alle verfügbaren Codecs, um alle mögliche Ausgabe ist groß), beachten Sie, dass während andere spezifische Codecs für einige bestimmte Zeichenfolgen funktioniert, kann es nicht oder Mapping enden zu der identischen Basis "Byte" Sequenz.

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

Natürlich kann die raw_unicode_escape nützlich sein, wenn Ihre Absicht alles auf eine Form von Basis Byte-Codierung, die auch etwas> erlauben zu kodieren ist \xff durch die \\uXXXX Form dargestellt werden:

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

Wählen Sie natürlich die Strategie, die für Ihre Absicht am sinnvollsten ist.

+0

warum ist das? Würde es dir etwas ausmachen, ein bisschen zu erklären? –

+1

@ Loïc Legacy-Gründe, aber ich dachte, ich posten die Antwort sofort, bevor ich in der Erklärung, die ich hatte Wiki bearbeiten, weil ich ernsthaft habe nicht alle verschiedenen Hintergrund in meinem Kopf. – metatoaster

+0

Danke für die Antwort und die Erklärung. –

1

Sie können alle Arten von Kodierungen ausprobieren, um zu sehen, ob sie Ihren Vorstellungen entsprechen.

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 

ERGEBNIS:

**    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

Dies ist ein ziemlich nützlicher Weg. Vielen Dank. –