Warum deklarieren Unicode durch Zeichenfolge in Python?
Ich bin immer noch lernen, python und ich habe einen Zweifel:
In python 2.6.x ich erklären in der Regel Codierung in die Datei-header, wie in diesem (wie in PEP 0263)
# -*- coding: utf-8 -*-
Danach, meine strings geschrieben werden wie üblich:
a = "A normal string without declared Unicode"
Aber jedesmal, wenn ich eine python-Projekt-code, die Codierung ist nicht deklariert in der header. Stattdessen ist es erklärt auf jede Zeichenfolge wie diese:
a = u"A string with declared Unicode"
Was ist der Unterschied? Was ist der Zweck dieses? Ich weiß, Python 2.6.x legt die ASCII-Kodierung standardmäßig, aber es kann überschrieben werden, indem die header-Erklärung, so was ist der Punkt, der pro string Erklärung?
Nachtrag: Scheint, dass ich Durcheinander Datei-Kodierung mit Kodierung. Danke für die Erklärung 🙂
# coding: utf8
ist gut genug, keine Notwendigkeit für die -*-
# coding: utf-8
. #coding=utf-8
. python.org/dev/peps/pep-0263 InformationsquelleAutor der Frage Oscar Carballal | 2010-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das sind zwei verschiedene Dinge, wie andere erwähnt haben.
, Wenn Sie angeben
# -*- coding: utf-8 -*-
, sagen Sie die Python-source-Datei, die Sie gespeichert haben istutf-8
. Die Standardeinstellung für Python 2 ist ASCII (für Python 3 ist esutf-8
). Dies beeinflusst nur, wie der interpreter liest die Zeichen in der Datei.Im Allgemeinen, es ist wahrscheinlich nicht die beste Idee zum einbetten hohen unicode-Zeichen in Ihre Datei ein, egal, was die Codierung ist; Sie können die Verwendung von string-unicode-escapes, die in entweder-Codierung.
, Wenn Sie erklären, eine Zeichenfolge mit einer
u
vor, wieu'This is a string'
sagt es der Python-compiler, der string Unicode ist, nicht bytes. Dies erfolgt meist transparent durch den interpreter; der offensichtlichste Unterschied ist, dass jetzt können Sie einbetten von unicode-Zeichen in der Zeichenfolge (u'\u2665'
jetzt legal ist). Sie könnenfrom __future__ import unicode_literals
zu machen, die Standardeinstellung.Gilt dies nur für Python 2 und Python 3 der Standard ist Unicode, und Sie müssen angeben, eine
b
vor (wieb'These are bytes'
zu erklären, eine Sequenz von bytes).InformationsquelleAutor der Antwort Chris B.
Wie schon andere gesagt haben,
# coding:
gibt die Codierung der source-Datei gespeichert ist. Hier sind einige Beispiele, die dies verdeutlichen:Eine Datei auf der Festplatte gespeichert, wie cp437 (meine Konsole Codierung), aber keine Codierung erklärt
Ausgabe:
Ausgabe der Datei mit
# coding: cp437
Hinzugefügt:Zuerst Python wusste nicht die Kodierung und beschwerte sich über die nicht-ASCII-Zeichen. Sobald er wusste, dass die Kodierung der byte-string bekam der bytes, die tatsächlich auf der Festplatte. Für die Unicode-Zeichenfolge, Python Lesen \x81, wusste, dass in cp437, dass war ein ü, und dekodiert es in den Unicode-codepoint für ü die U+00 FC. Wenn der byte-Zeichenfolge gedruckt wurde, Python schickte den hex-Wert
81
an der Konsole direkt. Wenn die Unicode-Zeichenfolge gedruckt wurde, Python richtig erkannt meine Konsole Codierung, wie cp437 und übersetzt Unicode ü auf die cp437 Wert für ü.Hier ist, was passiert mit einer Datei deklariert und in UTF-8 gesichert:
In UTF-8, ü wird codiert, wie der hex-bytes
C3 BC
, so dass der byte-string enthält die bytes, aber die Unicode-Zeichenfolge ist identisch mit dem ersten Beispiel. Python-Lesen Sie die zwei bytes und decodiert Sie es richtig. Python gedruckt byte-string falsch, denn er schickte die zwei UTF-8-bytes, die ü direkt zu meiner cp437 Konsole.Hier die Datei deklariert ist cp437, aber in UTF-8 gesichert:
Byte-string immer noch die bytes auf der Festplatte (UTF-8 hex-bytes
C3 BC
), sondern interpretiert Sie als zwei cp437 Zeichen anstatt ein einzelnes UTF-8-codierten Zeichen. Diese beiden Zeichen, wo die übersetzten Unicode-code-points und alles druckt falsch.InformationsquelleAutor der Antwort Mark Tolonen
Dass nicht das format der Zeichenfolge; es legt das format der Datei. Auch mit diesem header
"hello"
ist ein byte-string, nicht in einen Unicode-string. Um es Unicode, du gehst zu haben, um mitu"hello"
überall. Der header ist nur ein Hinweis darauf, was das format zu verwenden, wenn das Lesen der.py
Datei.InformationsquelleAutor der Antwort icktoofay
Die header-definition definieren Sie die Kodierung dem code selbst, nicht die resultierenden strings zur Laufzeit.
indem ein nicht-ascii-Zeichen wie ۲ in das python-Skript ohne die utf-8-header-definition wirft eine Warnung Fehler http://www.freeimagehosting.net/uploads/1ed15124c4.jpg
InformationsquelleAutor der Antwort ebt
wenn du mit python 2, fügen Sie diese:
from __future__ import unicode_literals
InformationsquelleAutor der Antwort jencko
Ich aus dem folgenden Modul genannt unicoder tun zu können, die transformation der Variablen:
Dann in Ihrem Programm können Sie Folgendes tun:
InformationsquelleAutor der Antwort José María Sánchez Ruiz