Seite 1 von 2

Anfängerfrage: Python 3.0 und coding: cp1252

Verfasst: Dienstag 9. Dezember 2008, 21:36
von jokoko
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.

Verfasst: Dienstag 9. Dezember 2008, 22:03
von DasIch
Das liegt daran dass in Python 3.0 Unicode Strings statt Bytecode Strings verwendet werden.

Verfasst: Dienstag 9. Dezember 2008, 22:12
von jokoko
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?

Verfasst: Dienstag 9. Dezember 2008, 22:16
von DasIch
Schau dir am besten mal das Unicode Howto an, dort wir alles zum Thema ausführlich behandelt.

Verfasst: Dienstag 9. Dezember 2008, 23:18
von Darii
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

Verfasst: Dienstag 9. Dezember 2008, 23:37
von Leonidas
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.

Verfasst: Mittwoch 10. Dezember 2008, 00:50
von jokoko
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!

Verfasst: Mittwoch 10. Dezember 2008, 05:13
von 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.

Verfasst: Mittwoch 10. Dezember 2008, 08:24
von jokoko
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!

Verfasst: Mittwoch 10. Dezember 2008, 11:10
von Leonidas
Die richtige Lösung ist ja eigentlich den Quellcode in UTF-8 abzuspeichern und die Encoding-Angabe im Quelltext wegzulassen. Zumindest bei Python 3.

Verfasst: Mittwoch 10. Dezember 2008, 16:27
von jokoko
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('üöä')
)

Verfasst: Samstag 13. Dezember 2008, 09:53
von jokoko
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!

Verfasst: Samstag 13. Dezember 2008, 13:04
von 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.

Verfasst: Donnerstag 12. März 2009, 18:37
von jokoko
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

Verfasst: Donnerstag 12. März 2009, 19:15
von b.esser-wisser
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

Verfasst: Samstag 14. März 2009, 10:15
von sma
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

Verfasst: Montag 16. März 2009, 11:50
von mkiever
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

Verfasst: Montag 16. März 2009, 12:05
von Leonidas
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.

Re: Anfängerfrage: Python 3.0 und coding: cp1252

Verfasst: Mittwoch 27. Februar 2013, 13:15
von barrio
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? :?

Re: Anfängerfrage: Python 3.0 und coding: cp1252

Verfasst: Mittwoch 27. Februar 2013, 13:37
von 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.