2016-05-18 18 views
4

Ich spielte mit Python-Unicode und Encoding-Methoden herum, ich benutzte das Sonderzeichen "‽" und ein chinesisches Zeichen, um zu sehen, wie verschiedene utf-Codierung mit diesen Zeichen umgehen, und ich bekomme diese Ausgabe.Python2.7, was bedeuten die Sonderzeichen in der utf-32-Kodierungsausgabe einer Unicode-Zeichenfolge?

>>> a = u"‽" 
>>> encoded_a = a.encode('utf-32') 
>>> a 
u'\u203d' 
>>> encoded_a 
'\xff\xfe\x00\x00= \x00\x00' 
>>> b = u"安" 
>>> encoded_b = b.encode('utf-32') 
>>> b 
u'\u5b89' 
>>> encoded_b 
'\xff\xfe\x00\x00\x89[\x00\x00' 

Meine Frage ist, was bedeutet das Gleichheitszeichen und die equare Klammer im codierten Ergebnis?

Antwort

1

Wenn Sie die repr eines Bytestring drucken, wird jeder Byte-Wert im Bereich von \x20 durch \x7e in ein äquivalentes ASCII printable character umgewandelt werden. In diesem Fall ist = das gleiche wie \x3d und [ ist dasselbe wie \x5b. Sie haben den Platz verpasst, der \x20 ist.

ist die komplette Tabelle:

\x20 ' ' \x21 '!' \x22 '"' \x23 '#' 
\x24 '$' \x25 '%' \x26 '&' \x27 ''' 
\x28 '(' \x29 ')' \x2a '*' \x2b '+' 
\x2c ',' \x2d '-' \x2e '.' \x2f '/' 
\x30 '0' \x31 '1' \x32 '2' \x33 '3' 
\x34 '4' \x35 '5' \x36 '6' \x37 '7' 
\x38 '8' \x39 '9' \x3a ':' \x3b ';' 
\x3c '<' \x3d '=' \x3e '>' \x3f '?' 
\x40 '@' \x41 'A' \x42 'B' \x43 'C' 
\x44 'D' \x45 'E' \x46 'F' \x47 'G' 
\x48 'H' \x49 'I' \x4a 'J' \x4b 'K' 
\x4c 'L' \x4d 'M' \x4e 'N' \x4f 'O' 
\x50 'P' \x51 'Q' \x52 'R' \x53 'S' 
\x54 'T' \x55 'U' \x56 'V' \x57 'W' 
\x58 'X' \x59 'Y' \x5a 'Z' \x5b '[' 
\x5c '\' \x5d ']' \x5e '^' \x5f '_' 
\x60 '`' \x61 'a' \x62 'b' \x63 'c' 
\x64 'd' \x65 'e' \x66 'f' \x67 'g' 
\x68 'h' \x69 'i' \x6a 'j' \x6b 'k' 
\x6c 'l' \x6d 'm' \x6e 'n' \x6f 'o' 
\x70 'p' \x71 'q' \x72 'r' \x73 's' 
\x74 't' \x75 'u' \x76 'v' \x77 'w' 
\x78 'x' \x79 'y' \x7a 'z' \x7b '{' 
\x7c '|' \x7d '}' \x7e '~' 

Ihre zwei Strings sind eigentlich '\xff\xfe\x00\x00\x3d\x20\x00\x00' und '\xff\xfe\x00\x00\x89\x5b\x00\x00'.

0

Die ersten beiden Hex-Codierungen repräsentieren die Stückliste (BOM). Mit Blick auf die Python documentation for Unicode scheint es, dass die Zeichen, die Sie sehen, die Übersetzung der Hex-Codierung sind. Ich betrachte eines der Beispiele in der Dokumentation, die das gleiche tun Sie sind zu sein scheint und die Übersetzung Druck aus:

8 >>> unistring.encode('utf-16') 
9 '\xff\xfeH\x00i\x00\n\x00' 
2

"\xff\xfe\x00\x00" ist eine Null-Breite, nicht blockierenden Raumzeichen, besser bekannt für seine Verwendung als Byte Order Marker (BOM). Beats me, warum Python dies in die Zeichenfolge einfügt, aber ich bin mir sicher, dass es eine Möglichkeit gibt, nur die Codierung der gegebenen Zeichenfolge anzufordern, kein Präfix für andere Programme, um dies als UTF-32 zu erkennen.

Danach folgen die Bytes 3d, 20 und zwei weitere Nullen, die den Codepunkt 203d in Little-Endian-Byte-Reihenfolge darstellen. Wenn 3d als ASCII interpretiert wird, wird es zum Gleichheitszeichen und 20 zum Leerzeichen.

+1

Python fügt die Stückliste ein, wenn Sie eine Codierung verwenden, die größer als 8 Bit ist, ohne Endianess anzugeben. Um die BOM zu verlieren, benutze 'utf-32le'' oder' utf-32be''. –