Python2-Strings sind verwirrend.
Erstens sind nicht nur Python-, sondern auch Geschichten zum Charaktercode kompliziert. Dies liegt wahrscheinlich daran, dass Menschen unterschiedliche Begriffe verwenden. Hier [Yukihiro Matsumoto Code World](http://www.amazon.co.jp/%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3% 82% 86% E3% 81% 8D% E3% 81% B2% E3% 82% 8D-% E3% 82% B3% E3% 83% BC% E3% 83% 89% E3% 81% AE% E4% B8 % 96% E7% 95% 8C% E2% 80% BE% E3% 82% B9% E3% 83% BC% E3% 83% 91% E3% 83% BC% E3% 83% BB% E3% 83% 97 % E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9E% E3% 81% AB% E3% 81% AA% E3% 82% 8B14% E3% 81% AE% E6 % 80% 9D% E8% 80% 83% E6% B3% 95 / dp / 4822234312 Gemäß der folgenden Definition in "Yukihiro Matsumoto Code World").
der Begriff | Bedeutung |
---|---|
Brief | Symbole, die in Systemen verwendet werden, die Sprache visuell darstellen |
Glyphe | Zeichenform einzelner Zeichen |
Zeichensatz | Eine Sammlung von Zeichen, die einer Zeichencodezuweisung unterliegen |
Zeichencode | Nummern, die einzelnen Zeichen zugewiesen sind |
Zeichencodierungsmethode | So drücken Sie den Zeichencode auf dem Computer aus |
In Python2 gibt es zwei Arten von Zeichenfolgen. Hier werden die beiden als ** str-Zeichenfolge ** und ** Unicode-Zeichenfolge ** bezeichnet, und diese werden zusammen als ** Zeichenfolge ** bezeichnet. Die Begriffe sind in den offiziellen Dokumenten nicht sehr einheitlich, daher werde ich sie vorerst so nennen.
Zunächst sollten Sie grundsätzlich Unicode-Zeichenfolgen verwenden.
'...'
Objekte, die von Literalen generiert werden>>> 'Ah'
'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
[]
gibt Bytes anstelle von Zeichen zurück>>> 'Ah'[0]
'\xe3'
>>> 'Ah'[1]
'\x81'
>>> 'Ah'[2]
'\x82'
>>> 'Ah'[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
len ()
gibt die Anzahl der Bytes zurück>>> len('Ah')
9
u '...'
Objekte, die von Literalen generiert werden>>> u'Ah'
u'\u3042\u3044\u3046'
[]
gibt Zeichen zurück>>> u'Ah'[0]
u'\u3042'
>>> u'Ah'[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
len ()
gibt die Anzahl der Zeichen zurück>>> len(u'Ah')
3
Wie oben erwähnt, weist der str-String die folgenden zwei Nachteile auf.
Auf der anderen Seite müssen Sie sich bei Unicode-Zeichenfolgen keine Sorgen machen. Daher sollten Sie die Unicode-Zeichenfolge anstelle der Zeichenfolge verwenden.
Verwenden Sie "isinstance (object, str)" und "isinstance (object, unicode)", um herauszufinden, ob ein Objekt eine str-Zeichenfolge und eine Unicode-Zeichenfolge ist. Es wird nicht empfohlen, den Typ nach "Typ (Objekt)" nachzuschlagen.
>>> isinstance(u'Ah', unicode)
True
>>> isinstance('Ah', str)
True
>>> isinstance('Ah', unicode)
False
>>> isinstance(u'Ah', str)
False
str string ↔ unicode Es gibt zwei Möglichkeiten, Strings ineinander zu konvertieren: Verwenden einer integrierten Funktion namens str / unicode und Verwenden der Methode encode / decode. Zunächst sollten Sie grundsätzlich die Codierungs- / Decodierungsmethode verwenden.
str/unicode
Python2 verfügt über zwei integrierte Funktionen, "str ()" und "unicode ()".
Die Referenz von str ()
lautet:
str([object]) Gibt eine Zeichenfolge zurück, die eine schöne druckbare Darstellung des Objekts enthält. ...
Die Referenz von "unicode ()" lautet wie folgt.
unicode([object[, encoding[, errors]]]) ... Wenn keine optionalen Parameter angegeben werden, ahmt unicode () das Verhalten von str () nach. Es wird jedoch eine Unicode-Zeichenfolge anstelle einer 8-Bit-Zeichenfolge zurückgegeben. ...
Kurz gesagt, "str ()" und "unicode ()" sind Methoden zum Zurückgeben von str-Strings und Unicode-Strings, die Objekte darstellen, und nicht zum Konvertieren von str-Strings und Unicode-Strings ineinander. Dass es keine gibt.
Da diese Funktionen so konzipiert sind, dass sie die speziellen Methoden __str__ ()
und __unicode__ ()
für definierte Objekte aufrufen, unterscheidet sich ihr Verhalten je nach Objekt.
encode/decode
String-Objekte haben die Methoden "encode ()" und "decode ()". Dies wird oft wie folgt erklärt.
encode ()
für eine Unicode-Zeichenfolge auf, um die Zeichenfolge str zu erhaltendecode ()
für eine str-Zeichenfolge ergibt eine Unicode-ZeichenfolgeDies ist nicht falsch, aber tatsächlich hat die Zeichenfolge str eine "encode ()" - Methode, und die Unicode-Zeichenfolge hat auch eine "decode ()" - Methode. Wenn Sie also "Ah". Encode () "ausführen, passiert etwas Seltsames, z. B." UnicodeDecodeError ".
Um das Verhalten von "encode ()" und "decode ()" zu untersuchen, habe ich "encode ()" und "decode ()" für verschiedene Kombinationen von Zeichenketten und Codierungsmethoden aufgerufen. Das Experiment wurde in einer Dialogumgebung durchgeführt. Die Codierungsmethode für die Eingabe / Ausgabe des Terminals ist UTF-8.
Beispielsweise gibt die sich überschneidende Masse von "abc" und ".encode (" ascii ")" die Ausgabe an, wenn "abc" .encode ("ascii") "in den Interpreter eingegeben wird.
Methode \ Zeichenfolge | 'abc' |
u'abc' |
'Ah' |
u'Ah' |
---|---|---|---|---|
.encode('ascii') |
'abc' |
'abc' |
Error(1) | Error(3) |
.encode('utf-8') |
'abc' |
'abc' |
Error(1) | '\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86' |
.encode('shift-jis') |
'abc' |
'abc' |
Error(1) | '\x82\xa0\x82\xa2\x82\xa4' |
.decode('ascii') |
u'abc' |
u'abc' |
Error(1) | Error(3) |
.decode('utf-8') |
u'abc' |
u'abc' |
u'\u3042\u3044\u3046' |
Error(3) |
.decode('shift-jis') |
u'abc' |
u'abc' |
Error(2) | Error(3) |
UnicodeDecodeError: 'ascii'-Codec kann Byte 0xe3 an Position 0 nicht dekodieren: Ordnungszahl nicht im Bereich (128)
UnicodeDecodeError: 'shift_jis'-Codec kann Byte 0x86 in Position 8: unvollständige Multibyte-Sequenz nicht dekodieren
UnicodeEncodeError: 'ascii'-Codec kann keine Zeichen an Position 0-2 codieren: Ordnungszahl nicht im Bereich (128)
Wie Sie diesem Ergebnis entnehmen können, wird "UnicodeDecodeError" angezeigt, obwohl Sie "encode ()" aufrufen, und umgekehrt wird "UnicodeEncodeError" angezeigt, obwohl Sie "decode ()" aufrufen.
Selbst wenn Sie sich [Referenz] ansehen (http://docs.python.jp/2.7/library/stdtypes.html "5. Eingebauter Typ - Python 2.7ja1-Dokumentation"), wurden die Spezifikationen nicht geschrieben, daher wird vermutet, aber str Wenn Sie "encode ()" für eine Zeichenfolge aufrufen, wird beispielsweise eine Dekodierung mit der ASCII-Codierungsmethode und eine erneute Codierung mit der angegebenen Codierungsmethode durchgeführt. Wenn die Unicode-Zeichenfolge "decode ()" lautet, wird das Gegenteil (Codierung mit der ASCII-Codierungsmethode → Decodierung mit der angegebenen Codierungsmethode) als aufgetreten angesehen. (Bitte sagen Sie mir, wenn Sie einen Fehler machen)
Für die Typkonvertierung zwischen str- und Unicode-Zeichenfolgen sollten Sie anstelle der integrierten Funktion str / unicode die Methode encode / decode verwenden.
Das Verständnis der Codierungs- / Decodierungsmethode besteht darin, dass "encode ()" eine str-Zeichenfolge zurückgibt und "decode ()" eine Unicode-Zeichenfolge zurückgibt, wenn die Codierungsmethode korrekt ist, unabhängig davon, ob es sich um eine str-Zeichenfolge oder eine Unicode-Zeichenfolge handelt. Sie sollten denken, dass es zurückkehren wird.
Verwenden wir Python3.
Recommended Posts