Menü Zeichenkodierung

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Redoute
User
Beiträge: 16
Registriert: Donnerstag 5. Juni 2008, 10:21

Hallo,

bei:

Code: Alles auswählen

# -*- coding: UTF-8 -*-

...

        item = menu.Append(wx.ID_UNDO, text = "&Rückgängig\tCtrl+Z")
werden die Umlaute unter Windows verstümmelt. Verwende ich:

Code: Alles auswählen

# -*- coding: cp1252 -*-
dann beschwert sich GTK, dass der String kein gültiges Unicode ist. Gibt es eine einfache Möglichkeit, die unter beiden Systemen funktioniert?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Redoute!

Willkommen im Python-Forum!

Drei Hinweise:
1.) Das Encoding-Cookie ``# -*- coding: xxx -*-`` muss das Encoding anzeigen, in welchem die Quellcodedatei gespeichert wird. Kein Probieren --> Wissen. Wenn du die Quellcodedatei in UTF-8 abspeicherst, dann muss hier auch "UTF-8" stehen -- und nichts anderes.

2.) Nimm Unicode-Strings statt Bytecodestrings. Kennzeichne den Text also mit einem vorangestellten "u".

Code: Alles auswählen

item = menu.Append(wx.ID_UNDO, text = u"&Rückgängig\tCtrl+Z")
3.) Unterstütze wxPython, indem du wxPython das Coding der Quellcodedatei mitteilst:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import wx

wx.SetDefaultPyEncoding("iso-8859-15")
...
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Redoute
User
Beiträge: 16
Registriert: Donnerstag 5. Juni 2008, 10:21

Danke! Mit

Code: Alles auswählen

wx.SetDefaultPyEncoding("UTF-8")
geht's jetzt auch unter Windows. Hätte mich auch gewundert, wenn die Menünamen explizit konvertiert werden müssten.

Sollte das nicht auch in der wxWidgets-Hilfedatei als Python-spezifische Ergänzung drinstehen?
gerold hat geschrieben:Nimm Unicode-Strings statt Bytecodestrings.
Macht das noch einen Unterschied, wenn das Programm in UTF-8 gespeichert ist?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Redoute hat geschrieben:
gerold hat geschrieben:Nimm Unicode-Strings statt Bytecodestrings.
Macht das noch einen Unterschied, wenn das Programm in UTF-8 gespeichert ist?
Hallo Redoute!

Man sollte an ein wx-Widget Unicode übergeben und beim Auslesen Unicode erwarten. ``wx.SetDefaultPyEncoding("UTF-8")`` ist nur ein Notnagel. Falls man vergisst, Unicode zu übergeben, versucht wxPython anhand dieser Information den Bytecode intern nach Unicode umzuwandeln.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Redoute
User
Beiträge: 16
Registriert: Donnerstag 5. Juni 2008, 10:21

gerold hat geschrieben:Man sollte an ein wx-Widget Unicode übergeben und beim Auslesen Unicode erwarten. ``wx.SetDefaultPyEncoding("UTF-8")`` ist nur ein Notnagel. Falls man vergisst, Unicode zu übergeben, versucht wxPython anhand dieser Information den Bytecode intern nach Unicode umzuwandeln.
Du hast vollkommen recht, wenn ich ein u vor den String setze, geht es auch ohne den "Notnagel".

Was mich immer noch irritiert: Der Quelltext ist UTF-8-kodiert - ich habe das jetzt noch einmal mittels Hex-Editor überprüft -, die Coding-Zeile am Anfang ist richtig angegeben, und trotzdem interpretiert wxPython (ohne Notnagel) offenbar unter Windows einen Bytestring nicht als UTF-8.

OK, ich habe das jetzt zur Kenntnis genommen und werde alle Einzelstrings als Unicode kennzeichnen. Danke schön!
BlackJack

Warum irritiert Dich das? Die Coding-Zeile hat damit nichts zu tun, die ist einzig und allein für den Compiler da, damit der weiss, wie er u'unicode'-Zeichenketten zu behandeln hat.
Antworten