Stefan Meretz
Thu, 16 Nov 2006 08:20:25 -0800
On 2006-11-16 11:35, Thomas Kalka wrote: > Das ganze ist leider noch nicht ganz transparent, > da ja auch noch das Terminal interpretiert. > Was kommt raus, wenn Du den MySQL-Output durch hexdump schickst ?
Folgender Test (Python console):
>>> import codecs
>>> oe = unicode('ö', 'utf8')
>>> f = codecs.open('utf8file.txt', 'w', 'utf-8')
>>> f.write(oe)
>>> f.close()
>>> print oe
ö
>>> oe
u'xf6'
Linux console:
hexdump -C utf8file.txt
00000000 c3 b6 |..|
00000002
Irgendwie war das doch zu erwarten, oder? Wenn das "print" richtig
interpretiert wird, dann auch das file.write. Erklären kann ich es aber
nicht.
Ok, noch folgender Test:
>>> oe1 = u'xf6'
>>> oe2 = u'xc3xb6'
>>> print oe1, oe2
ö ö
>>> oe1.encode('utf8')
'xc3xb6'
>>> oe2.encode('utf8')
'xc3x83xc2xb6'
>>> print oe1.encode('utf8'), oe2.encode('utf8')
ö ö
>>> print oe1.encode('latin1'), oe2.encode('latin1')
�ö
Erklärung willkommen:-)
> Eigentlich müsste M2 nicht öööö anzeigen sondern noch die
> zusätzlichen Escape-Codes.
Was ist M2?
> Hast Du beim Terminalprogramm für M2 ISO8... eingestellt oder utf8 ?
utf8 ist default bei Ubuntu.
> Soweit ich bisher verstehe, sind Unicode-Strings in Python so
> kodiert, das sie sagen, was Kodiert werden soll, nicht das Ergebnis.
>
> u'xc3xb6xc3xb6xc3xb6xc3xb6' kann nicht "öööö" ergeben.
So geht's (siehe oben):
>>> print u'xc3xb6xc3xb6xc3xb6xc3xb6'.encode('latin1')
öööö
mysql> select hex('ö');
+-----------+
| hex('ö') |
+-----------+
| C3B6 |
+-----------+
> Das das beim print-Statement trotzdem erscheint muss irgendwie
> am weiteren Transcoding auf dem Weg von Python über die Console
> übers Terminal zu deinen Augen geschehen.
Da fehlt noch ein Weg, an dem es vielleicht hängt:
Der von den Augen ins Hirn;-)
Ich kann im Moment auch nicht sonderlich gut nachdenken, weil eine
Erkältung im Anflug ist. Eventuell falle ich ein paar Tage aus, weil
flach. Also nicht wundern, wenn meine Antworten dauern...
Ciao,
Stefan
--
Start here: www.meretz.de