AW: [Python-de] Re: Alptraum Unicode

Martin v. Loewis martin at v.loewis.de
Son Dez 28 12:30:04 CET 2003


Olaf 'Ruebezahl' Radicke wrote:

> xml-string = ""
> #was habe ich jetzt UNICODE oder ASCII ?

Weder noch: xml-string ist vom <type 'str'>,
also ein Byte-String. 'ASCII-Strings' gibts
in Python nicht.

> xml_string = socket_objekt.empfangen()
> #was habe ich jetzt UNICODE oder ASCII ?

Byte-String.

> sql_query = patser_objekt.run(xml_string)
> #was habe ich jetzt UNICODE oder ASCII ?

Hängt von patser_objekt ab. Wenn Du nicht sicher
bist und es nicht dokumentiert ist, solltest Du

assert isinstance(sql_query, unicode)

schreiben.

> antwort = psql_objekt.query(sql_query)
> #was habe ich jetzt UNICODE oder ASCII ?

Genauso.

> interaktions_string = Tkinter_gui_dialog.run(antwort)
> #was habe ich jetzt UNICODE oder ASCII ?

Wenn die Zeichen ausschliesslich ASCII sind, hast
Du einen Byte-String, ansonsten einen Unicode-String.
Wenn Du immer einen Unicode-String haben willst,
solltest Du

interaktions_string = unicode(interaktions_string)

schreiben.

>         latex_code += test_str.encode("Latin-1")

Hier eine fragliche Design-Entscheidung: latex_code soll
offenbar Latin-1 kodiert sein. Wenn man den String inkrementell
aufbaut, muss man dann sicherstellen, dass jeder Teil auch
Latin-1 ist.

Alternativ kannst Du latex_code als Unicode-String aufbauen,
und die Sonderzeichenbehandlung ganz am Ende durchführen.

Für das inkrementelle Aufbauen empfehle ich, nicht += zu
verwenden, sondern eine Liste. Du kannst am Ende überprüfen,
ob alle Elemente der Liste wirklich Byte-Strings sind, bevor
Du sie verkettest (per "".join(liste))

>             dagesdatum.set_sekunden(dic_tages_doku['datum'])
>             latex_code  += dagesdatum.get_nice_string()

Potentiell ein Unicode-String. Da Du die Absicht hast, dass latex_code
ein byte_string wird, solltest Du sicherstellen, dass es auch einer
ist:

dagesdatum = dagesdatum.get_nice_string()
assert isinstance(dagesdatum, str)
latex_code += dagesdatum


>             latex_code  += unicode("\emph{ Erg�änzung: }","latin-1")
> #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> # Hopla! wieso muste ich hier  expliziet "unicode" ?

Das muss Dich stutzig machen. Ein String, den Du addiert hast,
ist offenbar ein Unicode-String. Du solltest herausfinden, welcher
das ist, und ihn dann in Latin-1 konvertieren.

> 
>             latex_code  += 
> _sonderzeichen_behandlung(dic_todo_doku['beschreibung'])

Und hier kracht's dann. Soweit ich verstanden habe, gibt
_sonderzeichen_behandlung einen Byte-String zurück, während
latex_code inzwischen ein Unicode-String ist. Damit wird
das system default encoding verwendet, um das Ergebnis
von _sonderzeichen_behandlung in Unicode zu konvertieren.

Falls Du das system default encoding nicht geändert hast
(was Du *nie* tun solltest), gibt diese Operation einen
UnicodeError, sowie die Beschreibung wirklich Sonderzeichen
enthält.

> # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> # Wieso zur Höle ist "latex_code" an dieser stell kein UNICODE?!

Da habe ich was nicht verstanden: latex_code sollte doch
ein Byte-String sein, kein Unicode-String????

Ciao,
Martin