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

Dienstag 9. Dezember 2008, 21:36

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: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dienstag 9. Dezember 2008, 22:03

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

Dienstag 9. Dezember 2008, 22:12

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: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dienstag 9. Dezember 2008, 22:16

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

Dienstag 9. Dezember 2008, 23:18

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 9. Dezember 2008, 23:37

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 Modvoice
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

Mittwoch 10. Dezember 2008, 00:50

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

Mittwoch 10. Dezember 2008, 05:13

@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

Mittwoch 10. Dezember 2008, 08:24

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 10. Dezember 2008, 11:10

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 Modvoice
jokoko
User
Beiträge: 7
Registriert: Dienstag 9. Dezember 2008, 21:23

Mittwoch 10. Dezember 2008, 16:27

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

Samstag 13. Dezember 2008, 09:53

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

Samstag 13. Dezember 2008, 13:04

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

Donnerstag 12. März 2009, 18:37

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.

Donnerstag 12. März 2009, 19:15

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!
Antworten