
Hi, wenn ich eine UTF-8-kodierte Datei einlese, und dann darin folgendermaßen was suche: datei = open(dateiname) for line in datei: if line[0] == '@': ... dann geht das schief, wenn das '@' in der allerersten Zeile der Datei als erstes Zeichen steht. Wenn ich eine Leerzeile einfüge (als erste Zeile), dann ist alles okay. Warum? Und wie finde ich das Zeichen '@' dennoch, wenn es das erste Zeichen der Datei ist? (Hat das vielleicht irgendwie mit BOMs zu tun oder so?) Dank & Gruss, Matthias [Python 2.5, WinXP]

Hi,
Sollte sein ... if line[0] == u'@': Datei muss auch in UTF8 kodiert sein. Bitte darauf achten. notfalls lass Dir den Wert ausgeben, damit Du erkennst, wie die Kodierung ist. Aber nicht print verwenden, setzt die Kodierung meistens um. Wenn Du damit nicht weiter kommst, schick den Wert, den Du prüfst in eine Datei und öffne diese mit einem Editor, in dem Du die Kodierung bestimmen kannst. Hoffe, dass ich Dir helfen konnte, Volker PS: Ich verwende dafür häufig gvim (:set enc=utf8) -- Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten Browser-Versionen downloaden: http://www.gmx.net/de/go/browser

Volker Helm (11.07.2008 09:48):
Ja, nee, das ist es nicht. Das Skript ist schon selber UTF-8: # -*- coding: utf-8 -*- Und ob vor das @ als Unicode-Zeichen markiert ist oder nicht, ändert nichts an dem seltsamen Verhalten. Ich habe auch mit Diez' Vorschlag rumgespielt, das codecs-Modul zu verwenden. Gibt auch Probleme. Unter WinXP und Python 2.5 liefert dies codecs.open(dateiname, 'r', 'BOM_UTF8') einen "LookupError: unknown encoding: BOM_UTF8" Hhmm. Matthias

Matthias Huening schrieb:
folgendes tuts, und kommt mit und ohne BOM zurecht: fp = codecs.open("tt.txt", encoding="utf_8_sig") for line in fp: print repr(line) Gruß, Uwe -- Dr. rer. nat. Uwe Schmitt F&E Mathematik mineway GmbH Science Park 2 D-66123 Saarbrücken Telefon: +49 (0)681 8390 5334 Telefax: +49 (0)681 830 4376 uschmitt@mineway.de www.mineway.de Geschäftsführung: Dr.-Ing. Mathias Bauer Amtsgericht Saarbrücken HRB 12339

Hallo Matthias, On 2008-07-11 14:21, Matthias Huening wrote:
Ja, nee, das ist es nicht. Das Skript ist schon selber UTF-8: # -*- coding: utf-8 -*-
diese Encoding-Zeile sagt Python, dass die _Datei_ in UTF-8 kodiert ist. Das ist wichtig, wenn in deiner Datei andere Zeichen als in 7-Bit-ASCII vorkommen, zum Beispiel Umlaute. Ob vor einem String das u-Präfix steht, ist eine ganz andere Geschichte. Wenn ja, bekommst du einen Unicode-String, wenn nicht, einen Byte-String (8-Bit-Zeichen). Wenn du also # encoding: utf-8 am Anfang der Datei stehen hast, aber einen String mit s = "Byte-String" erzeugst, verweist der Name s "trotzdem" auf einen Byte-String. Wenn oben in der Datei # encoding: latin1 (Datei ist in einem 8-Bit-Encoding) steht und in der Datei u = u"Unicode-String" vorkommt, verweist der Name u auf einen Unicode-String. Die Encoding-Deklaration am Dateianfang entscheidet _nicht_ darüber, ob ein String aus Sicht von Python ein Byte-String oder ein Unicode-String ist. Sie sagt Python "nur", in welchem Encoding Nicht-7-Bit-Zeichen in Zeichenketten-Konstanten vorliegen. Viele Grüße Stefan

Hi,
Sollte sein ... if line[0] == u'@': Datei muss auch in UTF8 kodiert sein. Bitte darauf achten. notfalls lass Dir den Wert ausgeben, damit Du erkennst, wie die Kodierung ist. Aber nicht print verwenden, setzt die Kodierung meistens um. Wenn Du damit nicht weiter kommst, schick den Wert, den Du prüfst in eine Datei und öffne diese mit einem Editor, in dem Du die Kodierung bestimmen kannst. Hoffe, dass ich Dir helfen konnte, Volker PS: Ich verwende dafür häufig gvim (:set enc=utf8) -- Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten Browser-Versionen downloaden: http://www.gmx.net/de/go/browser

Volker Helm (11.07.2008 09:48):
Ja, nee, das ist es nicht. Das Skript ist schon selber UTF-8: # -*- coding: utf-8 -*- Und ob vor das @ als Unicode-Zeichen markiert ist oder nicht, ändert nichts an dem seltsamen Verhalten. Ich habe auch mit Diez' Vorschlag rumgespielt, das codecs-Modul zu verwenden. Gibt auch Probleme. Unter WinXP und Python 2.5 liefert dies codecs.open(dateiname, 'r', 'BOM_UTF8') einen "LookupError: unknown encoding: BOM_UTF8" Hhmm. Matthias

Matthias Huening schrieb:
folgendes tuts, und kommt mit und ohne BOM zurecht: fp = codecs.open("tt.txt", encoding="utf_8_sig") for line in fp: print repr(line) Gruß, Uwe -- Dr. rer. nat. Uwe Schmitt F&E Mathematik mineway GmbH Science Park 2 D-66123 Saarbrücken Telefon: +49 (0)681 8390 5334 Telefax: +49 (0)681 830 4376 uschmitt@mineway.de www.mineway.de Geschäftsführung: Dr.-Ing. Mathias Bauer Amtsgericht Saarbrücken HRB 12339

Hallo Matthias, On 2008-07-11 14:21, Matthias Huening wrote:
Ja, nee, das ist es nicht. Das Skript ist schon selber UTF-8: # -*- coding: utf-8 -*-
diese Encoding-Zeile sagt Python, dass die _Datei_ in UTF-8 kodiert ist. Das ist wichtig, wenn in deiner Datei andere Zeichen als in 7-Bit-ASCII vorkommen, zum Beispiel Umlaute. Ob vor einem String das u-Präfix steht, ist eine ganz andere Geschichte. Wenn ja, bekommst du einen Unicode-String, wenn nicht, einen Byte-String (8-Bit-Zeichen). Wenn du also # encoding: utf-8 am Anfang der Datei stehen hast, aber einen String mit s = "Byte-String" erzeugst, verweist der Name s "trotzdem" auf einen Byte-String. Wenn oben in der Datei # encoding: latin1 (Datei ist in einem 8-Bit-Encoding) steht und in der Datei u = u"Unicode-String" vorkommt, verweist der Name u auf einen Unicode-String. Die Encoding-Deklaration am Dateianfang entscheidet _nicht_ darüber, ob ein String aus Sicht von Python ein Byte-String oder ein Unicode-String ist. Sie sagt Python "nur", in welchem Encoding Nicht-7-Bit-Zeichen in Zeichenketten-Konstanten vorliegen. Viele Grüße Stefan
participants (7)
-
Christopher Arndt
-
Diez B. Roggisch
-
Matthias Huening
-
Stefan Schwarzer
-
Uwe Schmitt
-
Volker Helm
-
Walter Dörwald