Seite 1 von 1

Verfasst: Mittwoch 25. Oktober 2006, 09:15
von gerold
Francesco hat geschrieben:Überall ein u vorsetzten u"String". Oder muss ich das eh nicht?
Hi Francesco!

Das "u" ist nur dann wichtig, wenn der Text Umlaute enthält. Sonst kannst du es weg lassen, da wxPython nur dann meckert, wenn der Text nicht umgewandelt werden kann.

Übergebe ich an wxPython einen normalen String, dann wandelt wxPython (Unicode) den String automatisch intern nach Unicode um. Somit kümmert sich wxPython um die korrekte Umwandlung. Vorausgesetzt, das Coding des Moduls, das im Kopf angegebene Coding und das an wxPython per ``wx.SetDefaultPyEncoding`` übermittelte Coding stimmen überein.

Übergebe ich an wxPython (Unicode) einen Unicode-String, dann braucht wxPython nichts mehr umwandeln. Python kümmert sich um die Umwandlung (richtiges Encoding im Kopf des Moduls ist Voraussetzung, dass Python u"Strings" korrekt umwandeln kann).

wxPython (Unicode) hält sich an diese Aussagen:
- Gib mir Unicode und ich zeige den Text korrekt an.
- Ich gebe dir Unicode zurück. So weißt du immer, was du von mir zu erwarten hast.

Du kannst ja auch auf Nummer-Sicher gehen.
In diesem Beispiel habe ich den ``encodinghelper`` eingebunden, dass Ausgaben an STDOUT automatisch umgewandelt werden. Dann habe ich mit ``wx.SetDefaultPyEncoding("iso-8859-1")`` wxPython mitgeteilt, dass Strings, die nicht Unicode sind, in diesem Coding vorliegen.

Code: Alles auswählen

#!/usr/bin/env python -O
# -*- coding: iso-8859-1 -*-

import wx
import encodinghelper

wx.SetDefaultPyEncoding("iso-8859-1")

app = wx.PySimpleApp()
f = wx.Frame(None)
vbox = wx.BoxSizer(wx.VERTICAL)
f.SetSizer(vbox)
lab1 = wx.StaticText(f, -1, u"Über den Wolken")
vbox.Add(lab1)
print repr(lab1.GetLabel()), type(lab1.GetLabel())
lab2 = wx.StaticText(f, -1, "Über den Wolken")
vbox.Add(lab2)
print repr(lab2.GetLabel()), type(lab2.GetLabel())
f.Show()
app.MainLoop()
lg
Gerold
:-)

Verfasst: Mittwoch 25. Oktober 2006, 09:27
von gerold
PS: Dieses Beispiel funktioniert auch unter Ubuntu-Linux, da mit ``wx.SetDefaultPyEncoding`` wxPython das reale Encoding des Moduls mitgeteilt wurde.

Da Ubuntu intern mit UTF-8 arbeitet, geht wxPython auch davon aus, dass Strings, die nicht UNICODE sind, als UTF-8 übergeben werden. Erst mit ``wx.SetDefaultPyEncoding`` wird wxPython das Encoding mitgeteilt, welches in Wirklichkeit verwendet wurde. -- Die Datei wurde ja unter Windows erstellt! ;-)

lg
Gerold
:-)

Verfasst: Mittwoch 25. Oktober 2006, 09:55
von Francesco
gerold hat geschrieben:PS: Dieses Beispiel funktioniert auch unter Ubuntu-Linux, da mit ``wx.SetDefaultPyEncoding`` wxPython das reale Encoding des Moduls mitgeteilt wurde.

Da Ubuntu intern mit UTF-8 arbeitet, geht wxPython auch davon aus, dass Strings, die nicht UNICODE sind, als UTF-8 übergeben werden. Erst mit ``wx.SetDefaultPyEncoding`` wird wxPython das Encoding mitgeteilt, welches in Wirklichkeit verwendet wurde. -- Die Datei wurde ja unter Windows erstellt! ;-)

lg
Gerold
:-)
Danke nochmals für Deine Mühe! :)

Verfasst: Mittwoch 25. Oktober 2006, 10:02
von BlackJack
Francesco hat geschrieben: Nur eines: Wenn ich sicher bin,
dass keine Übersetzung erfolgt und alles auf Englisch halte, warum solle
ich dann Unicode verwenden?
Das fällt in die Kategorie von Aussagen wie "640 KB sind genug" oder "Im Jahr 2000 gibt es einen Bedarf von 5 Computern weltweit" (IBM Manager).

Und auch bei englischen Anwendungen bringt Unicode mehr als ASCII. Zum Beispiel echte Anführungszeichen, Auslassungspunkte, "fremde" Buchstaben wenn man in der GUI Werte für Theta, Ohm, Angström oder ähnliches abfragen will. Die Betriebssysteme bzw. GUI Toolkits können mittlerweile alle Unicode, warum sollte man sich dann künstlich einschränken?

Und spätestens wenn Du irgendwo Texteingabe erlaubst, und sei es nur im Dateidialog, musst Du damit rechnen, dass die Leute sich immer mehr daran gewöhnen, dort eintragen zu können was ihre Tastatur hergibt.

Wenn man mit Texten arbeitet, fährt man IMHO am besten wenn alles auf den Weg ins Programm in Unicode gewandelt wird und bei der Ausgabe wieder in eine Kodierung die Unicode komplett kodieren kann, also zum Beispiel UTF-8.

Verfasst: Mittwoch 25. Oktober 2006, 10:27
von Francesco
BlackJack hat geschrieben:
Francesco hat geschrieben: Nur eines: Wenn ich sicher bin,
dass keine Übersetzung erfolgt und alles auf Englisch halte, warum solle
ich dann Unicode verwenden?
Das fällt in die Kategorie von Aussagen wie "640 KB sind genug" oder "Im Jahr 2000 gibt es einen Bedarf von 5 Computern weltweit" (IBM Manager).

Und auch bei englischen Anwendungen bringt Unicode mehr als ASCII. Zum Beispiel echte Anführungszeichen, Auslassungspunkte, "fremde" Buchstaben wenn man in der GUI Werte für Theta, Ohm, Angström oder ähnliches abfragen will. Die Betriebssysteme bzw. GUI Toolkits können mittlerweile alle Unicode, warum sollte man sich dann künstlich einschränken?

Und spätestens wenn Du irgendwo Texteingabe erlaubst, und sei es nur im Dateidialog, musst Du damit rechnen, dass die Leute sich immer mehr daran gewöhnen, dort eintragen zu können was ihre Tastatur hergibt.

Wenn man mit Texten arbeitet, fährt man IMHO am besten wenn alles auf den Weg ins Programm in Unicode gewandelt wird und bei der Ausgabe wieder in eine Kodierung die Unicode komplett kodieren kann, also zum Beispiel UTF-8.
Ack. Auf das habe ich nicht gedacht, dass auch mittels Tastatur immer mehr Zeichen möglich sind, die nicht im Standard Ascii Zeichensatz enthalten sind und die Sachen, die Du gesagt hast mit Ohm und Angström gebe ich Dir auch komplett recht. ;)