Unicode und andere import, export...

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
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

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 &#xfc;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
BlackJack

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
Was ist bitte 'Dort'? Wo steht das?

Das heisst das ``u'de-de' `` eine Unicode Zeichenkette ist, die ist nicht kodiert. Die bekommt man wenn man andere Kodierungen dekodiert!
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?
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.

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.
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
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.
Interessant ist auch das hier:
Index bricht &#xfc;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?
Das ist eine XML Entity. Normalerweise sollte das der XML-Parser auflösen können.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.
Das ist wirklich ein wichtiger Punkt, der leider aus der http://p-nand-q.com/python/unicode_faq.html nicht klar hervorgeht, finde ich!

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!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

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??
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

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
BlackJack

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