Thomas Kalka
Wed, 15 Nov 2006 09:36:00 -0800
> Der Webserver ist neutral. Es sieht merkwürdig aus und scheint mit der > DBAPI MySQLdb zu tun zu haben. Eine ausführliche Beschreibung habe ich > an die TurboGears-Liste gepostet, ist leider noch nicht im Web zum > referenzieren. > > Daraus dieses Snippet: > > 1st machine: Select from tg-admin: > >>>> from model import * >>>> t = Testtable.selectone() >>>> t.test >>>> > u'xf6xf6xf6xf6' > Das ist nicht utf8, bei UTF8 gibt es keine Zeichen, die größer sind als 127. Siehe http://de.wikipedia.org/wiki/UTF-8 UTF-8 ist variabel langes Encoding (bis 4 Byte pro Zeichen). Was sagt auf dieser Maschine und der anderen $$ locale ? >>>> print t.test >>>> > öööö > > 2nd machine: Select from tg-admin (don't know, why looks different): > In [1]: from model import * > In [2]: t = Testtable.selectone() > In [3]: t.test > Out[3]: u'xc3xb6xc3xb6xc3xb6xc3xb6' > In [4]: print t.test > öööö > > Viermal ö deswegen, weil es in der Liste hieß, dass MySQL in einem > varchar(4)-Feld bei einem Unicode-String nur zwei Zeichen speichern > würde, weil "Unicode" das in zwei Byte darstellt. Also auf jeden Fall > speichert MySQL öööö in einem varchar(4) Feld - utf8 ist doch > ein "Einbyte-Encoding", oder? Und utf16 ein "Zweibyte-Encoding". > > Wikipedia (link oben) erklärt das ganz gut. > Die Ausgabe der 1st machine liefert auf meinem Laptop eine perfekte > Darstellung, die Ausgabe der 2nd Maschine liefert das, was ihr im Web > seht. Das erste sieht aus wie utf8-encodiert, das zweite wie utf16. > Weil: eine doppelte Kodierung - was soll das sein? utfx ist ja kein > Zeichensatz, sondern nur ein Interpretationsschema. Aber ich gebe zu, > dass ich das nicht so ganz blicke. > > Nein, ist nicht interpretation sonder Kodierung. Alle Unicode-Zeichen können in utf-8 codiert werden, nehmen dann mehr Platz ein, erst ein Escape-Zeichen, dann die Bits ... Die erste Maschine (Dein Laptop) scheint gar nicht UTF-8 zu produzieren sonder ganz normales ISO8irgendwas > Auf jeden Fall ist die Python-Console so nett, beide > Stringrepräsentationen gleich zu interpretieren. Nur in der Webseite > passt es nicht mehr, weil die ja eindeutig utf8 ist. > > In der TG-Liste merkern viele über MySQL: Keine Datenbank würde solche > Encoding-Probleme machen wie MySQL. > > Solche Erfahrungen habe ich bisher nicht gemacht. Du kannst in MYSQL für jedes Attribut und jede Tabelle die Collation einstellen. Dann noch für die Verbindung. Um von der lokalen Einstellung für Zeichenkodierung unabhängig zu sein, sende ich nach dem Aufbau einer MySQL-Connection mysql_query("SET NAMES 'utf8'",$DB); mysql_query("SET CHARACTER SET utf8"); Ich schlage vor, zuerst ohne Python mit der Console (mysql) zu probieren. --tk [Datei- oder HTML-Anhang entfernt]