Problem mit Unicode... ;)

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

Dienstag 23. Januar 2007, 21:26

EnTeQuAk hat geschrieben:

Code: Alles auswählen

                # Inhalt einlesen
                r_data = open(self.project_path+data_file, 'r').read()
                if not isinstance(r_data, unicode):
                    r_data = r_data.decode('iso-8859-1')
                else:
                    print 'nöööö'
Hi EnTeQuAk!

Ich lese gar nicht weiter, dann hier liegt schon mal ein Fehler vor.
Wenn du mit ``open`` oder mit ``file`` eine Textdatei öffnest und einliest, dann hast du kein Unicode. Du hast einen Bytestring in irgendeiner Codierung. Welche das ist, hängt primär vom verwendeten Betriebssystem und von der Ländereinstellung ab. Unter einem deutschsprachigen Windows wird das wohl "cp1252" sein. Unter einem deutschsprachigen Linux meistens "iso-8859-1(5)" oder "UTF-8". Ein paar Dateien sind unter Windows auch UTF-16-codiert, aber die sind eher selten.

Du brauchst also nicht prüfen, ob du Unicode raus bekommst, denn da kommt kein Unicode raus. Unicode wird nur intern verwendet.

Versuche also erst mal das bevorzugte Encoding raus zu bekommen:

Code: Alles auswählen

import locale
print locale.getpreferredencoding()
Dann würde ich versuchen, mit Hilfe dieses bevorzugten Encodings, den Bytestring nach Unicode umzuwandeln:

Code: Alles auswählen

>>> f = file("J://Ablage//irgendeinedatei.txt", "r")
>>> bytestring = f.read()
>>> unicodestring = f.read().decode(locale.getpreferredencoding())
>>> f.close()
>>>
Erst wenn es dabei einen Fehler gibt, dann würde ich dem Benutzer ein paar Encodings in einer Combobox zur Auswahl präsentieren. Diese Auswahl würde ich in einer INI-Datei speichern und beim nächsten Mal zuerst das gespeicherte Encoding ausprobieren -- dann erst das ``preferredencoding``.

mfg
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:

Dienstag 23. Januar 2007, 21:40

...das hätte ich fast vergessen. :-)

Wenn du einen UNICODE-String hast und du möchtest diesen in eine Textdatei, mit dem für das Betriebssystem und dessen Ländereinstellung üblichen Encoding schreiben, dann bist du mit dem ``codecs``-Modul bestens bedient.

Code: Alles auswählen

>>> import codecs
>>> import locale
>>> f = codecs.open("J://Ablage//irgendeinedatei.txt", mode='w', encoding = locale.getpreferredencoding())
>>> f.write(u"löüäßßßß") # hier wissen wir genau, dass es ein UNICODE-String ist. :-)
>>> f.close()
>>>

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten