Hallo,
ich glaube ich habe die Probleme jetzt erkannt und fasse hier einmal alles zusammen. Falls manches unnoetig ist... bitte bescheid geben.
z.B. Quelle Focus RSS Server. Dort steht: 'language': u'de-de'. Das heisst doch dass die Daten mit unicode kodiert sind und locale(de,de). Wieso wird nirgend utf-8 oder 16... angegeben. Ist das egal?
Nun ja. Jetzt parse ich mit z.b feedparser titel und link von allen Eintraegen.
Dies moechte ich in eine eigene XML Datei schreiben. Dazu habe ich es so angelegt:
Document =u'<blah>eefef<title>'+unicode(title)+u'</title>ggrg'
Dann:
fuer Ausgabe:
ausgabe = Document.encode('utf-8')
Ausgabe:
import codecs
f.file('/home/...','wt')
f.write(codecs.BOM_LE) #damit es direkt richtig angezeigt wird
f.write ausgabe
f.close()
Weiss nur nicht ganz wozu ausgabe = Doc.enc(utf8) gut ist. Wird das nicht schon oben erkannt durch u'', oder braucht man es um zwischen utf16... zu unterscheiden? und unicode title. Wozu?
Was macht man eigentlich, wenn man verschiedene Quellen in einen Text schreiben will? Latin-1, utf-8... kann ich da einfach jede Quelle mit *.encode(utf-8) kodieren und dann so zusammenfassenText =a+b+c
Danke,
Interessant ist auch das hier:
Index bricht überraschend
bei dem text, wo ich jedes Zeichen mit eigener Codetabelle wandeln musste. normal sollte es so aussehen \xfc und dann aber auch nicht angezeigt werden, sondern direkt als umlaut ausgegeben werden. Weiss jemand woher das ; und die zwei zeichen vor dem codewort kommen koennen?
Eigentlich lege ich ja die zeichen so an text = u'/xfc'+...
Das sollte doch klappen, wie bei dem RSS server, oder?
Patrick
Unicode und andere import, export...
Was ist bitte 'Dort'? Wo steht das?patrickk hat geschrieben:z.B. Quelle Focus RSS Server. Dort steht: 'language': u'de-de'. Das heisst doch dass die Daten mit unicode kodiert sind
Das heisst das ``u'de-de' `` eine Unicode Zeichenkette ist, die ist nicht kodiert. Die bekommt man wenn man andere Kodierungen dekodiert!
Unicode Zeichenketten können nur innerhalb von laufenden Programmen existieren. Wenn Du Daten einlesen oder ausgeben willst, dann müssen die irgendwie kodiert werden, zum Beispiel als UTF-8. Wenn Du Unicode Zeichenketten im Quelltext angibst, dann bewirkt das 'u' davor, das Python diese Zeichenkette dekodiert, weil man Unicode ja nicht in einer Datei stehen haben kann, sondern immer nur eine Kodierung davon. Es wird die Kodierung zum dekodieren genommen, die oben in der Datei als spezieller Kommentar angegeben ist, oder ASCII falls der Kommentar nicht im Quelltext steht.Dies moechte ich in eine eigene XML Datei schreiben. Dazu habe ich es so angelegt:
Document =u'<blah>eefef<title>'+unicode(title)+u'</title>ggrg'
Dann:
fuer Ausgabe:
ausgabe = Document.encode('utf-8')
Ausgabe:
import codecs
f.file('/home/...','wt')
f.write(codecs.BOM_LE) #damit es direkt richtig angezeigt wird
f.write ausgabe
f.close()
Weiss nur nicht ganz wozu ausgabe = Doc.enc(utf8) gut ist. Wird das nicht schon oben erkannt durch u'', oder braucht man es um zwischen utf16... zu unterscheiden? und unicode title. Wozu?
Die Byte Order Mark (BOM) macht bei UTF-8 übrigens keinen Sinn, da dort mit einzelnen Bytes gearbeitet wird. Nur bei UTF-16 oder UTF-32 kann es wichtig sein zu wissen in welcher Reihenfolge die 16 bzw. 32 Bit Werte in der Datei stehen.
Die Texte mit den entsprechenden Kodierungen dekodieren, zusammenfügen und dann so kodieren, dass alle Zeichen korrekt kodiert werden können. UTF-8 bietet sich da an, weil man damit den gesamten Unicode Umfang kodieren kann.Was macht man eigentlich, wenn man verschiedene Quellen in einen Text schreiben will? Latin-1, utf-8... kann ich da einfach jede Quelle mit *.encode(utf-8) kodieren und dann so zusammenfassenText
Das ist eine XML Entity. Normalerweise sollte das der XML-Parser auflösen können.Interessant ist auch das hier:
Index bricht überraschend
bei dem text, wo ich jedes Zeichen mit eigener Codetabelle wandeln musste. normal sollte es so aussehen \xfc und dann aber auch nicht angezeigt werden, sondern direkt als umlaut ausgegeben werden. Weiss jemand woher das ; und die zwei zeichen vor dem codewort kommen koennen?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das ist wirklich ein wichtiger Punkt, der leider aus der http://p-nand-q.com/python/unicode_faq.html nicht klar hervorgeht, finde ich!BlackJack hat geschrieben:Wenn Du Unicode Zeichenketten im Quelltext angibst, dann bewirkt das 'u' davor, das Python diese Zeichenkette dekodiert, weil man Unicode ja nicht in einer Datei stehen haben kann, sondern immer nur eine Kodierung davon. Es wird die Kodierung zum dekodieren genommen, die oben in der Datei als spezieller Kommentar angegeben ist, oder ASCII falls der Kommentar nicht im Quelltext steht.
Jetzt erklärt sich auch für mich, das es ganz gut ist, wenn man seine Skripte mit # -*- coding: UTF-8 -*- versieht Da sind mir einige Probleme automatisch erspart geblieben!
Jetzt verstehe ich das mit den codings... bisher hat bei mir die zweite Zeile leider nichts bewirkt. Aber jetzt verstehe ich es. Weiss nur nicht was nicht klappt:
Das erscheint wenn ich # -*- coding: UTF-8 -*- in dem Modul angebe.
import GSM2Ascii #module includes implementation of gsm2ascii decoding
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa6 in position 0: unexpected code byte
Und wenn nicht:
DeprecationWarning: Non-ASCII character '\xa6' in file /home/GSM2Ascii.py on line 42, but no encoding declared;
Das macht ja auch sinn, weil in meinem Dict: "10001010":u'/xfe' zugewiesen wird. Das Coding ist ja nicht angegeben. aber warun erscheint diese Meldung oben? Bei den String Operationen, die ich habe mit den "1010111". Dort ist kein u angegeben. Dann sollte es doch mit Ascii decodiert werden und falls doch unicode sollte es doch egal sein, wenn 1 und 0 gleich ist??
Das erscheint wenn ich # -*- coding: UTF-8 -*- in dem Modul angebe.
import GSM2Ascii #module includes implementation of gsm2ascii decoding
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa6 in position 0: unexpected code byte
Und wenn nicht:
DeprecationWarning: Non-ASCII character '\xa6' in file /home/GSM2Ascii.py on line 42, but no encoding declared;
Das macht ja auch sinn, weil in meinem Dict: "10001010":u'/xfe' zugewiesen wird. Das Coding ist ja nicht angegeben. aber warun erscheint diese Meldung oben? Bei den String Operationen, die ich habe mit den "1010111". Dort ist kein u angegeben. Dann sollte es doch mit Ascii decodiert werden und falls doch unicode sollte es doch egal sein, wenn 1 und 0 gleich ist??
hi, merkwuerdig ist auch:
"10010101":u'\xfc'
Wenn dieses Zeichen erscheint passiert folgendes:
mein code:
zeichen = dict[tmp1]
store1=zeichen.encode('utf-8')
print (store1)
dann erscheint:
&
#
x
f
c
;
fuer dieses Zeichen. Das kann doch nicht sein. Ausser, wenn die Zeichen so gesendet werden, oder?
Da koennte ich doch vielleicht nach den ersten beiden zeichen und dem letzten parsen und den inhalt dann als u'/'+"xfc" umwandeln. Dann muesste das mit dem encode(utf-8 klappen, oder)
Patrick
"10010101":u'\xfc'
Wenn dieses Zeichen erscheint passiert folgendes:
mein code:
zeichen = dict[tmp1]
store1=zeichen.encode('utf-8')
print (store1)
dann erscheint:
&
#
x
f
c
;
fuer dieses Zeichen. Das kann doch nicht sein. Ausser, wenn die Zeichen so gesendet werden, oder?
Da koennte ich doch vielleicht nach den ersten beiden zeichen und dem letzten parsen und den inhalt dann als u'/'+"xfc" umwandeln. Dann muesste das mit dem encode(utf-8 klappen, oder)
Patrick
Ich würde mal darauf tippen, das der Quelltext nicht UTF-8 kodiert ist. Was siehst Du denn für ein Zeichen an der entsprechenden Stelle im Texteditor? Ein durchbrochener senkrechter Strich? Dann ist das wahrscheinlich ISO-8859-1, auch bekannt als Latin-1.patrickk hat geschrieben:Das erscheint wenn ich # -*- coding: UTF-8 -*- in dem Modul angebe.
import GSM2Ascii #module includes implementation of gsm2ascii decoding
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa6 in position 0: unexpected code byte