Dinge, die Sie bei der Verarbeitung von Zeichenfolgen in Python2 beachten sollten

UnicodeEncodeError, der größte natürliche Feind (Übertreibung) für Python-Programmierer (mit Python2), die mit Japanisch umgehen. Die Person neben mir war gestern die Beute, und während ich bei der Lösung half, konnte ich die Richtung der Zeichenfolgenverarbeitung in Python 2 ein wenig bestimmen. (Ich möchte bald eine Python 3-Version zusammenstellen)

Persönliches Fazit

Byte-String und Unicode-String

Die Byte-Zeichenfolge wird durch eine bestimmte Codierungsmethode (z. B. Utf-8) codiert und im Literal als "das" ausgedrückt. Andererseits ist eine Unicode-Zeichenfolge eine Anordnung von Unicode-Codepunkten, und im Literal wird "u" wie "u" hinzugefügt.

python


(py2.7)~ » ipython
   (Kürzung)
>>> 'Ah' #Byte-String
Out[1]: '\xe3\x81\x82'

>>> u'Ah' #Unicode-Zeichenfolge
Out[2]: u'\u3042'

>>> 'Ah'.decode('utf-8') (or unicode('Ah', 'utf-8')) #Byte-String->Unicode-Zeichenfolge(=Dekodieren)
Out[3]: u'\u3042'

>>> u'Ah'.encode('utf-8') #Unicode-Zeichenfolge->Byte-String(=Kodieren)
Out[4]: '\xe3\x81\x82'

Wenn Sie mit der Funktion "Typ" prüfen, können Sie feststellen, dass die Byte-Zeichenfolge vom Typ "Str" / die Unicode-Zeichenfolge vom Typ "Unicode" ist.

python


>>> type('a')
Out[5]: str

>>> type(u'a')
Out[6]: unicode

Darüber hinaus sind in Python2 sowohl Byte-Strings als auch Unicode-Strings Strings und können verkettet werden.

python


>>> u'a' + 'a'
Out[7]: u'aa'

Was. Es gibt kein Problem.

Ja, ich muss mich mit Japanisch auseinandersetzen (um genau zu sein, alle Nicht-ASCII-Zeichen)! Wie Sie der Ausgabe des obigen Beispiels entnehmen können, wird durch Kombinieren einer Unicode-Zeichenfolge und einer Byte-Zeichenfolge eine Unicode-Zeichenfolge erstellt. Dabei müssen Sie die Byte-Zeichenfolge in eine Unicode-Zeichenfolge dekodieren. Das Problem hierbei ist jedoch, dass die Python-Zeichenfolge keine Informationen zu ihrer eigenen Codierung enthält.

"Wenn Sie nicht wissen, wie man codiert, können Sie es in ASCII decodieren", sagt Python und Hello UnicodeEncodeError. Es ist selten, dass Literale solche Fehler machen, aber es ist leicht, Fehler zu machen, wenn Sie nicht auf die Zeichenfolgen achten, die von außerhalb Ihres eigenen Programms empfangen werden (einschließlich Standardeingabe / -ausgabe).

python


>>> u'a' + 'Ah' #Unicode-Zeichenfolge und Byte-Zeichenfolge(Nicht-ASCII)Kombinieren
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-8-084e015bd795> in <module>()
----> 1 u'a' + 'Ah'

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

>>> u'a' + 'Ah'.decode('utf-8') #Byte-String->Unicode-Zeichenfolge
Out[9]: u'a\u3042'

>>> print(u'a' + 'Ah'.decode('utf-8'))
a ah

Der Grund für die Umstellung auf eine Unicode-Zeichenfolge anstelle einer Byte-Zeichenfolge besteht darin, dass es häufig bequemer ist, mit einer Zeichenfolge auf Codepunktebene als auf Byte-Ebene zu arbeiten. Wenn Sie beispielsweise die Anzahl der Zeichen zählen möchten, können Sie die Funktion len für Unicode-Zeichenfolgen verwenden. Andererseits gibt eine Byte-Zeichenfolge die Anzahl der Bytes zurück, sodass sie nicht mit dieser Absicht verwendet werden kann.

python


>>> len(u'Ah')
Out[11]: 3

>>> len('Ah')
Out[12]: 9

Unicode-Zeichenfolge ist die beste! Ich wollte keine Byte-Zeichenfolge!

Ist nicht. Betrachten Sie als Beispiel das folgende einfache Programm.

test.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

print(u'Ah' + u'Sagen')

Versuchen Sie es im Terminal. Wahrscheinlich kann die Mehrheit der Menschen dies ohne Probleme tun.

python


(py2.7)~ » python test.py
Ah

Wie wäre es also damit, die Ausführungsergebnisse in eine Datei umzuleiten? Es gibt viele Umgebungen, in denen UnicodeEncodeError wie unten gezeigt auftritt.

python


(py2.7)~ » python test.py > test.txt
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    print(u'Ah')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

Lokalisierungs- und Codierungsmethode

Im Beispiel print (u'Ai ') wird eine Unicode-Zeichenfolge an die Standardausgabe übergeben, aber zu diesem Zeitpunkt wird die Unicode-Zeichenfolge-> Byte-Zeichenfolge konvertiert (codiert). Wenn die Standardeingabe / -ausgabe mit dem Terminal verbunden ist, wählt Python automatisch die entsprechende Codierungsmethode aus dem Wert des Gebietsschemas aus (z. B. Umgebungsvariable LANG). Wenn andererseits die Standardeingabe / -ausgabe durch Umleitung usw. mit einem anderen als dem Terminal verbunden ist, können keine Informationen zum Auswählen einer geeigneten Codierungsmethode erhalten werden, und die Codierung wird in ASCII und in den meisten Fällen versucht (= wenn Nicht-ASCII-Zeichen enthalten sind). Scheitern.

(ref.) http://blog.livedoor.jp/dankogai/archives/51816624.html

Das Codieren der Unicode-Zeichenfolge vor dem Übergeben an die Standardausgabe kann dieses Problem lösen.

test.py(Unicode-Zeichenfolge->Byte-String)


#!/usr/bin/env python
# -*- coding: utf-8 -*-

print((u'Ah' + u'Sagen').encode('utf-8'))

Ich habe immer gedacht

Durch Angabe der Umgebungsvariablen "PYTHONIOENCODING" kann die verwendete Codierungsmethode unabhängig vom Gebietsschema festgelegt werden. Wenn Sie dies angeben, müssen Sie es nicht einzeln codieren.

python


(py2.7)~ » cat test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print(u'Ah' + u'Sagen')
(py2.7)~ » PYTHONIOENCODING=utf-8 python test.py > test.txt
(py2.7)~ » cat test.txt
Ah

(ref.) http://methane.hatenablog.jp/entry/20120806/1344269400

Recommended Posts

Dinge, die Sie bei der Verarbeitung von Zeichenfolgen in Python2 beachten sollten
Dinge, die Sie bei der Verarbeitung von Zeichenfolgen in Python 3 beachten sollten
Dinge, die Sie bei der Entwicklung von Crawlern in Python beachten sollten
Dinge, die Sie beim Kopieren von Python-Listen beachten sollten
Vorsichtsmaßnahmen bei der Verwendung von Python mit AtCoder
Dinge, die Sie bei der Verwendung von CGI mit Python beachten sollten.
Dinge, die Sie bei der Verwendung von Python beachten sollten, wenn Sie MATLAB verwenden
Beachten Sie Folgendes, wenn Sie automatisierte Tools für die Werkstatt in Python erstellen
Beachten Sie Folgendes, wenn Sie Keras auf Ihrem Mac bereitstellen
Beachten Sie Folgendes, wenn Sie mit ndarray einen Zeilenvektor in einen Spaltenvektor konvertieren
Beachten Sie beim Initialisieren einer Liste in Python
Dinge, die Sie bei der Stapelvorhersage mit der GCP ML Engine beachten sollten
Dinge, auf die Sie achten müssen, wenn Sie Standardargumente in Python verwenden
Zusammenfassung der Punkte, die beim Schreiben eines Programms zu beachten sind, das unter Python 2.5 ausgeführt wird
3 Möglichkeiten, Zeitzeichenfolgen mit Python zu analysieren [Hinweis]
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
Fehler beim Versuch, psycopg2 in Python zu installieren
Dateiverarbeitung in Python
Multithread-Verarbeitung in Python
Textverarbeitung mit Python
Verarbeitung in Python beenden
Vergleichen Sie Zeichenfolgen in Python
Strings in Python umkehren
Verwendung mehrerer Argumente bei der Parallelverarbeitung mithilfe der Mehrfachverarbeitung in Python
So messen Sie die Verarbeitungszeit mit Python oder Java
Django klassenbasierte Ansicht
Dinge, die Sie bei der Verarbeitung von Zeichenfolgen in Python2 beachten sollten
Dinge, die Sie bei der Verarbeitung von Zeichenfolgen in Python 3 beachten sollten
Berücksichtigen Sie bei der Verarbeitung von DynamoDB Stream mit Lambda (Python) die allgemeine Vorverarbeitung.
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
Beenden bei Verwendung von Python in Terminal (Mac)
Ich möchte am Ende etwas mit Python machen
Ich möchte Strings in Kotlin wie Python manipulieren!
UTF8-Textverarbeitung mit Python
So löschen Sie stdout in Python
Melden Sie sich auf der Website in Python an
Achtung bei os.mkdir in Python
Bildverarbeitungssammlung in Python
Wie man in Python entwickelt
Verwenden des Python-Modus in der Verarbeitung
Post an Slack in Python
Python3-Verarbeitung, die in Paiza verwendbar zu sein scheint
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
Praktische Schreibmethode beim kontinuierlichen Anhängen an die Liste in Python
Was tun, wenn in Python "SSL: CERTIFICATE_VERIFY_FAILED _ssl.c: 1056" angezeigt wird?
Erlauben Sie Python, die Zeichenfolge der Eingabedatei aus dem Ordner auszuwählen
Verarbeitungsreihenfolge beim Verketten im PySpark
[Unterprozess] Wenn Sie ein anderes Python-Programm in Python-Code ausführen möchten
Überlassen Sie die mühsame Verarbeitung Python
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht
[Python] Wie man PCA mit Python macht
Verarbeitung zur Verwendung von notMNIST-Daten in Python (und versucht, sie zu klassifizieren)
Signalverarbeitung in Python (1): Fourier-Transformation
Vorsichtsmaßnahmen bei der Verwendung von Pit mit Python
Dinge, die Sie beim Benennen des dynamischen Routings in nuxt.js beachten sollten
Konvertieren Sie Markdown in Python in PDF
So sammeln Sie Bilder in Python
100 Sprachverarbeitung Knock Kapitel 1 in Python
Verhalten beim Auflisten in Python heapq
[Einführung in Python3 Tag 13] Kapitel 7 Zeichenfolgen (7.1-7.1.1.1)
Verwendung von SQLite in Python
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)
Im Python-Befehl zeigt Python auf Python3.8