Unicode problem

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.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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! :)
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.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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. ;)
Antworten