dev  

Re: [ot:dev] Re: Encoding-Problem

Stefan Meretz
Fri, 17 Nov 2006 05:14:02 -0800

On 2006-11-17 09:10, Thomas Kalka wrote:
> 'öööö' ist in unicode immer u'xf6xf6xf6xf6'
> siehe http://www.utf8-zeichentabelle.de/

Na, vormails hast du mir noch erklärt, dass das kein utf8 ist, weil 
jenseits von 127;-)

Aber ok, inzwischen habe ich verstanden: f6 ist der "Codepoint", also 
die Position in der utf8-Tabelle. Das heißt, es gibt eine Art doppeltes 
Mapping:

Zeichen => Codepoint (Decoding)
Codepoint => Bytefolge (Encoding)

wobei gilt:
Decoding: Umwandlung externe => interne Repräsentation
Encoding: Umwandlung interne => externe Repräsentation

Die interne Repräsentation ist der Codepoint, der auf den eigentlichen 
Codewert als Bytefolge verweist. Wie der interpretiert wird, hängt von 
den Einstellungen des jeweiligen "Geräts" ab.

> Je nach Setting der Variable LANG wird das dann beim Ausgeben anders
> gerendert:
> (in einem UTF-8 Terminal, ubuntu-box):
>
> [EMAIL PROTECTED]:~$ export LANG=POSIX
> [EMAIL PROTECTED]:~$ python -c "import sys; print sys.stdout.encoding,
> u'xf6'" ANSI_X3.4-1968 Traceback (most recent call last):
>   File "<string>", line 1, in ?
> UnicodeEncodeError: 'ascii' codec can't encode character u'xf6' in
> position 0: ordinal not in range(128)
>
> [EMAIL PROTECTED]:~$ export LANG=de_DE
> [EMAIL PROTECTED]:~$ python -c "import sys; print sys.stdout.encoding,
> u'xf6'" ISO-8859-1 ?
>
> [EMAIL PROTECTED]:~$ export LANG=de_DE.utf8
> [EMAIL PROTECTED]:~$ python -c "import sys; print sys.stdout.encoding,
> u'xf6'" UTF-8 ö

Genau!

> Das Problem bei Dir scheint aber nicht Python zu sein, sondern die
> Verbindung von MySQL zu Python,
> da da doppelt encodierte UTF-8 Strings ankommen.

Da bin ich jetzt auch bei meinen Nachforschungen gelandet, letztlich bei 
der Python MySQLdb. Die ist nämlich auf der Produktionsmaschine ein 
Tick älter:
Laptop: 1.2.1_p2
Server: 1.2.1g2

Das ist letztlich auch der einzige Unterschied zwischen den beiden 
Rechnern.

> Es sieht so aus, dass MySQL in UTF8 sendet,

jepp

> Python davon ausgeht, dass das ISO8859 ist und das dann zu falschen
> Unicode-Strings encoded.

Ja, so sieht es aus. MySQLdb ist jetzt mein Kandidat;-)

Später, jetzt erstmal wieder ins Bett...

Danke für deine instruktiven Erklärungen!

Ciao,
Stefan

-- 
Start here: www.meretz.de