Ich lerne immer noch Python und habe Zweifel:
In Python 2.6.x deklariere ich normalerweise die Codierung im Dateikopf wie folgt (wie in PEP 0263 ).
# -*- coding: utf-8 -*-
Danach werden meine Strings wie gewohnt geschrieben:
a = "A normal string without declared Unicode"
Aber jedes Mal, wenn ich einen Python-Projektcode sehe, wird die Codierung nicht im Header deklariert. Stattdessen wird es an jeder Zeichenfolge wie folgt deklariert:
a = u"A string with declared Unicode"
Was ist der Unterschied? Was ist der Zweck davon? Ich weiß, dass Python 2.6.x standardmäßig die ASCII-Codierung festlegt, diese kann jedoch durch die Header-Deklaration überschrieben werden. Wozu dient also die Zeichenfolgendeklaration?
Nachtrag: Scheint, als hätte ich die Dateicodierung mit der Zeichenfolgencodierung verwechselt. Danke, dass du es erklärt hast :)
# coding: utf8
ist gut genug, keine Notwendigkeit für-*-
# coding: utf-8
.#coding=utf-8
. python.org/dev/peps/pep-0263Antworten:
Das sind zwei verschiedene Dinge, wie andere erwähnt haben.
Wenn Sie angeben
# -*- coding: utf-8 -*-
, teilen Sie Python mit, welche Quelldatei Sie gespeichert habenutf-8
. Die Standardeinstellung für Python 2 ist ASCII (für Python 3utf-8
). Dies wirkt sich nur darauf aus, wie der Interpreter die Zeichen in der Datei liest.Im Allgemeinen ist es wahrscheinlich nicht die beste Idee, hohe Unicode-Zeichen in Ihre Datei einzubetten, unabhängig von der Codierung. Sie können String-Unicode-Escapezeichen verwenden, die in beiden Codierungen funktionieren.
Wenn Sie eine Zeichenfolge mit einer erklären
u
vor , wieu'This is a string'
es die Python - Compiler sagt , dass die Zeichenfolge Unicode ist die Bytes nicht. Dies wird vom Dolmetscher meist transparent gehandhabt; Der offensichtlichste Unterschied besteht darin, dass Sie jetzt Unicode-Zeichen in die Zeichenfolge einbetten können (das heißt, diesu'\u2665'
ist jetzt zulässig). Sie könnenfrom __future__ import unicode_literals
es als Standard festlegen.Dies gilt nur für Python 2; In Python 3 ist der Standardwert Unicode, und Sie müssen ein vorangestelltes angeben
b
(z. B.b'These are bytes'
um eine Folge von Bytes zu deklarieren).quelle
Gibt, wie andere gesagt haben,
# coding:
die Codierung an, in der die Quelldatei gespeichert ist. Hier einige Beispiele, um dies zu veranschaulichen:Eine Datei, die auf der Festplatte als cp437 (meine Konsolencodierung) gespeichert, aber keine Codierung deklariert ist
Ausgabe:
Ausgabe der Datei mit
# coding: cp437
hinzugefügt:Zuerst kannte Python die Codierung nicht und beschwerte sich über das Nicht-ASCII-Zeichen. Sobald die Codierung bekannt war, erhielt die Byte-Zeichenfolge die Bytes, die sich tatsächlich auf der Festplatte befanden. Für die Unicode-Zeichenfolge wusste Python \ x81, dass dies in cp437 ein ü war , und decodierte es in den Unicode-Codepunkt für ü, der U + 00FC ist. Beim Drucken der Byte-Zeichenfolge hat Python den Hex-Wert
81
direkt an die Konsole gesendet . Beim Drucken der Unicode-Zeichenfolge hat Python meine Konsolencodierung als cp437 korrekt erkannt und Unicode ü in den cp437-Wert für ü übersetzt .Folgendes passiert mit einer in UTF-8 deklarierten und gespeicherten Datei:
In UTF-8 wird ü als Hex-Byte codiert
C3 BC
, sodass die Byte-Zeichenfolge diese Bytes enthält, die Unicode-Zeichenfolge jedoch mit dem ersten Beispiel identisch ist. Python hat die beiden Bytes gelesen und korrekt dekodiert. Python hat die Byte-Zeichenfolge falsch gedruckt, da die beiden UTF-8-Bytes, die ü darstellen, direkt an meine cp437-Konsole gesendet wurden.Hier wird die Datei als cp437 deklariert, aber in UTF-8 gespeichert:
Die Byte-Zeichenfolge enthält weiterhin die Bytes auf der Festplatte (UTF-8-Hex-Bytes
C3 BC
), interpretiert sie jedoch als zwei cp437-Zeichen anstelle eines einzelnen UTF-8-codierten Zeichens. Diese beiden Zeichen wurden in Unicode-Codepunkte übersetzt, und alles wird falsch gedruckt.quelle
Dadurch wird das Format der Zeichenfolge nicht festgelegt. Es legt das Format der Datei fest. Auch mit diesem Header
"hello"
ist eine Byte-Zeichenfolge keine Unicode-Zeichenfolge. Um es zu Unicode zu machen, müssen Sie esu"hello"
überall verwenden. Der Header ist nur ein Hinweis darauf, welches Format beim Lesen der.py
Datei verwendet werden soll.quelle
Die Header-Definition definiert die Codierung des Codes selbst und nicht die resultierenden Zeichenfolgen zur Laufzeit.
Wenn Sie ein Nicht-ASCII-Zeichen wie ۲ in das Python-Skript ohne die Definition des utf-8-Headers einfügen, wird eine Warnung ausgegeben
quelle
Ich habe das folgende Modul namens unicoder erstellt, um die Transformation für Variablen durchführen zu können:
Dann könnten Sie in Ihrem Programm Folgendes tun:
quelle