Anfängerfrage: Python 3.0 und coding: cp1252

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

Hallo,

bin Python-Anfänger und habe eine Frage zum Thema coding.
Die Zeilen

Code: Alles auswählen

# -*- coding: cp1252 -*-
print("üöä")
liefern in Python 2.5.2 die korrekte Ausgabe der Umlaute.

In Python 3.0 führen diese Zeilen jedoch zu einer kryptischen Darstellung (üöä)

Wenn ich die coding-Zeile in Python 3.0 weglasse und die Fehlermeldung ignoriere, dann ist die Darstellung korrekt.

Darauf kann ich mir leider keinen Reim machen.

Ich bin für jede Hilfe dankbar.
Vielen Dank vorab.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das liegt daran dass in Python 3.0 Unicode Strings statt Bytecode Strings verwendet werden.
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

DasIch hat geschrieben:Das liegt daran dass in Python 3.0 Unicode Strings statt Bytecode Strings verwendet werden.
Danke, das hilft mir schon weiter.

Wie schreibe ich dann aber diese Zeile(n) so, dass weder der Editor eine Fehlermeldung liefert noch die Shell die falsche Ausgabe erzeugt und das Ganze auch noch im Sinne des Erfinders ist?

Oder muss ich unter Configure Idle den Wert für "Default Source Encoding" auf "utf-8" oder "Locale-defined" stellen und auf die coding-Zeile verzichten?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Schau dir am besten mal das Unicode Howto an, dort wir alles zum Thema ausführlich behandelt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

jokoko hat geschrieben:Oder muss ich unter Configure Idle den Wert für "Default Source Encoding" auf "utf-8" oder "Locale-defined" stellen und auf die coding-Zeile verzichten?
Guck mal, obs ohne IDLE geht, denn eigentlich sollte das in Python3 erst recht keine Probleme machen
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

DasIch hat geschrieben:Das liegt daran dass in Python 3.0 Unicode Strings statt Bytecode Strings verwendet werden.
Zusätzlich wird als Standardencoding für Quelltext nicht mehr ASCII verwendet sondern UTF-8.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

Das HowTo habe ich gelesen, dort steht
Python supports writing source code in UTF-8 by default, but you can use almost any encoding if you declare the encoding being used. This is done by including a special comment as either the first or second line of the source file
Meine ursprüngliche Frage ist - wenn ich es richtig verstanden habe - aber noch nicht beantwortet: Warum liefert idle 3.0 keine korrekte Ausgabe der Umlaute, wenn ich auf westeuropäischen Code umschalte?

Vielen Dank auf jeden Fall schon mal für die vielen schnellen Antworten - ihr seid super!
BlackJack

@jokoko: Du schaltest ja nirgends um. Der Kommentar sagt Python nur in welcher Kodierung der Quelltext gespeichert ist und in der Kodierung sollter er dann auch wirklich gespeichert sein. Du hast Python gesagt der Quelltext sei cp1252 wo er in Wirklichkeit aber als UTF-8 gespeichert ist. Wenn Du im Kommentar cp1252 sagst, musst Du Deinem Editor beim speichern halt auch sagen, dass er wirklich als cp1252 abspeichern soll.
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

BlackJack hat geschrieben:[...]Wenn Du im Kommentar cp1252 sagst, musst Du Deinem Editor beim speichern halt auch sagen, dass er wirklich als cp1252 abspeichern soll.
Ich möchte ja gerne IDLE verwenden.

Ist folgende Vorgehensweise dann korrekt?
  • cp1252 in den Kommentar zu schreiben und
  • unter Options->Configure Idle die Einstellung General->Default Source Encoding->Locale-defined wählen
Vielen Dank weiterhin!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Die richtige Lösung ist ja eigentlich den Quellcode in UTF-8 abzuspeichern und die Encoding-Angabe im Quelltext wegzulassen. Zumindest bei Python 3.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

Sorry, irgendwo hängt's bei mir immer noch (ich bitte schon mal um Entschuldigung...)

Wenn ich unter Options->Configure Idle die Einstellung General->Default Source Encoding->UTF-8 wähle und auf die Encoding-Angabe im Quelltext verzichte, dann gibt es einen SyntaxError: invalid character in identifier.

Wenn ich unter Options->Configure Idle die Einstellung General->Default Source Encoding->None wähle und auf die Encoding-Angabe im Quelltext verzichte, dann gibt es ein I/O-Warning: Non-ASCII found, yet no encoding declared. Add a line like # -*- coding: cp1252 -*-.
Wenn ich diese aber hinzufüge, dann gibt es die im ersten Post berichtete falsche Ausgabe.

(Bei allem geht es nach wie vor um Python 3 und dort nur um die IDLE-Umgebung mit "eingebautem" Editor.
Die einzige Zeile in meinem Programm ist dann nur noch

Code: Alles auswählen

print('üöä')
)
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

Hallo, darf ich das Thema noch mal hervorholen, weil meine Frage für mich bis jetzt unbeantwortet ist:

Wie schreibe ich in Python 3 mit IDLE eine Datei, die nur die Zeile

Code: Alles auswählen

print ("üöä")
enthält korrekt?

Welche Einstellungen müssen in Configure IDLE getätigt werden?
Welche Encoding-Angabe muss ggf. hinzu?

Ich habs einfach noch nicht kapiert und bitte um Nachsicht und Hilfe.

Vielen Dank!
BlackJack

Die Datei musst Du UTF-8-kodiert speichern. Und hoffen, dass Python herausfinden kann, welche Kodierung das Programm auf der anderen Seite von `sys.stdout` erwartet.
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

Mein Problem wurde eigenltich nie gelöst...

bis Python 3.0.1 herauskam.

Jetzt kann ich besagte Zeile einfach so schreiben, ohne dass es irgendwelche Schwierigkeiten gibt.

Ein Frage bleibt: ist die Angabe

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
sinnvoll oder nicht (unter Windows, Python 3.0.1)?

danke
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

jokoko hat geschrieben:Ein Frage bleibt: ist die Angabe
Code: (Python)
1

# -*- coding: iso-8859-1 -*-

sinnvoll oder nicht (unter Windows, Python 3.0.1)?
ganz klar: Nein!
Es sei denn, du bearbeitest eine Datei, die unter einem anderen OS erstellt wurde

Wenn du einen Editor verwendest, der UTF-8 nicht kann, sondern stattdessen das encoding des Systems verwendet, nimm

Code: Alles auswählen

# -*- coding: cp1252 -*-
In allen anderen Fällen:
- Stell den Editor auf utf-8
- korrigiere ALLE Sonderzeichen (nur darauf bezieht sich das encoding überhaupt)
- und Lass die "coding:"-Zeile weg
(Unter Python 3)

hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich schließe mich dem ersten "Nein" an - UTF-8 ist der "way to go". Selbst notepad.exe kann das seit Jahren. Zu dem "es sei denn" möchte ich allerdings anmerken, dass es nicht automatisch cp-1252 ist, sondern dann notgedrungen das Encoding, welches der Editor benutzt. Das muss man dann hat einfach herhausfinden. Wahrscheinlich wird es das sein, was auch die Plattform standardmäßig benutzt und das ist wiederum hochgradig Betriebssystem- und Länderabhängig. Wenn's kein deutsches Windows ist, dann ist es auch nicht cp-1252.

Stefan
mkiever
User
Beiträge: 19
Registriert: Mittwoch 4. März 2009, 18:06
Wohnort: Braunschweig

Hallo,

da tut sich bei mir noch eine Frage auf:
Basieren die ganzen Hinweise auf "coding Zeile weglassen"
auf irgendeinem style-guide (bitte mit Referenz) oder ist das eine persönliche
Vorliebe?
Bei mir haben alle Python Quellen systematisch eine coding Angabe
(ich bin allerdings noch nicht bei Python 3).

Grüße,
Matthias Kievernagel
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Die coding-Zeile ist in Python 2.x nötig, denn dort ist das Default-Encoding für Quelltext ASCII. Wenn du etwas in der Datei hast was nicht-ASCII ist, ist das entweder eine Warnung oder ein SyntaxError. Daher wird in Python 2.x oft "coding: utf-8" geschrieben. In Python 3 braucht man dies nicht mehr zu machen, denn dort ist das Standardencoding für Dateien nicht mehr ASCII sondern UTF-8, da macht die coding-Zeile keinen Sinn, wenn es sowieso schon UTF-8 ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
barrio
User
Beiträge: 30
Registriert: Dienstag 26. Februar 2013, 13:15

Hi zusammen,

ich hätte auch ne kleine newbe-Anmerkung dazu:

Wenn man aus dem deutschen Tutorial 3.3 sniplets in den IDLE Editor (windows) kopiert, läuft das bei der HTML-Version problemlos. Beim PDF geht zum einen die Einrückung verloren und wenn man das manuell behebt kommt der "invalid character in identifier"-error, obwohl alles o.k. aussieht, z.B. mit ersten sniplet 4.7.1 def ask_ok... Bei der Fehlermeldung wird das "J" in complaint=’Bitte Ja oder Nein!’ rot markiert.

Werden da durch das PDF-Format irgendwelche nicht sichtbaren non-UTF-8-Zeichen mitkopiert oder was ist da los? :?
> (...(lambda...(it-schemes-i-must-be-jailed-in-braces? code)...))))))))))))))))))))))))))
#t
lunar

@barrio Nein. “Nicht sichtbare non-UTF-8-Zeichen“ ist Blödsinn…

Sieh Dir die Zeichen im Quelltext genau an, insbesondere die Anführungszeichen. Du wirst feststellen, dass im PDF, und mithin auch im daraus kopierten Quelltext nicht der Apostroph ' steht, sondern das rechte einfache Anführungszeichen ’. Woran das liegt, weiß ich nicht, ich nehme an, Sphinx – das Programm, mit dem HTML und PDF erzeugt werden – ersetzt Apostrophe durch diese Anführungszeichen, weil man in normalem Fließtext eigentlich typographisch korrekte Anführungszeichen haben möchte. Nur eben im Quelltext nicht…

Lesson learned: Kopiere Quelltext nie aus PDF-Dokumenten. Die sind nicht zum Kopieren, sondern zum Lesen und Drucken da, und mithin stehen da im Hinblick auf Lesbarkeit und Ästhetik mitunter andere Zeichen, als in syntaktisch korrektem Quelltext eigentlich erforderlich wären.

Und für die Zukunft: Grabe bitte keine uralten Themen für völlig unabhängige Fragen aus. Themen kosten nichts, und Du darfst wirklich gerne neue erstellen, wenn Du Fragen hast.
Antworten