Python2 str / unicode und codieren / decodieren

Einführung

Python2-Strings sind verwirrend.

der Begriff

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

Zwei Arten von Zeichenketten

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.

str string

>>> 'Ah'
'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
>>> '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('Ah')
9

Unicode-Zeichenfolge

>>> u'Ah'
u'\u3042\u3044\u3046'
>>> 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(u'Ah')
3

Zusammenfassung

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.

Untersuchen Sie den Typ eines Zeichenfolgenobjekts

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

Konvertieren Sie den Typ eines Zeichenfolgenobjekts

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.

Dies 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)

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)

Zusammenfassung

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.

abschließend

Verwenden wir Python3.

Recommended Posts

Python2 str / unicode und codieren / decodieren
Experimentiert mit Unicode, Decodierung und Codierung
str und unicode
Pythons regulärer Ausdruck, str und unicode sind nüchtern
Mein str (Python)
Base64 decodieren / codieren
str und repr
[Python] Komprimieren und dekomprimieren
Python- und Numpy-Tipps
[Python] Pip und Wheel
Python Iterator und Generator
Dekodieren Sie ShiftJIS in Unicode
Python-Pakete und -Module
Vue-Cli- und Python-Integration
Ruby, Python und Map
Python-Eingabe und Ausgabe
Python und Ruby teilen sich
Wenn in Python ein "Unicode-Dekodierungsfehler" auftritt
Python asyncio und ContextVar
Holen Sie sich Python-Webseite, Zeichenkodierung und Anzeige
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python: Klassen- und Instanzvariablen
3-3, Python-Zeichenfolge und Zeichencode
Python 2-Serie und 3-Serie (Anaconda Edition)
Python und Hardware-Verwenden von RS232C mit Python-
Python auf Ruby und wütend Ruby auf Python
Python-Einzug und String-Format
Installieren Sie Python und Flask (Windows 10)
Informationen zu Python-Objekten und -Klassen
Informationen zu Python-Variablen und -Objekten
Apache mod_auth_tkt und Python AuthTkt
Å (Ongustorome) und NFC @ Python
Lernen Sie Python-Pakete und -Module kennen
# 2 [python3] Trennung und Kommentar aus
Flache Python-Kopie und tiefe Kopie
Python und Ruby Slice Memo
Python-Installation und grundlegende Grammatik
Ich habe Java und Python verglichen!
Flache Python-Kopie und tiefe Kopie
Über Python, len () und randint ()
Informationen zu Python-Datums- und Zeitzone
Installieren Sie Python 3.7 und Django 3.0 (CentOS)
Python-Umgebungskonstruktion und TensorFlow
Ruby- und Python-Syntax ~ branch ~
[Python] Python und Sicherheit - is Was ist Python?
Stapel und Warteschlange in Python
Python-Metaklasse und SQLalchemie deklarativ
Implementierung von Fibonacci und Primzahlen (Python)
Python-Grundlagen: Bedingungen und Iterationen
Python-Bitoperator und logische Summe
Python-Debug- und Testmodul
Python-Liste und Tapples und Kommas
Python-Variablen und Objekt-IDs
Python-Listeneinschlussnotation und Generator
Über Python und reguläre Ausdrücke
Python mit Pyenv und Venv
Unittest und CI in Python
Maxout Beschreibung und Implementierung (Python)
[Python] Quotient und Überschuss erhalten