Das Freuen betrifft allerdings nur noch Unicode-Texte aus der Programmdatei. Wenn ich die Daten aus der Datenbank lese, bekomme ich UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128).
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs
import sys
import MySQLdb
db = MySQLdb.connect(host='localhost', user='testuser', passwd='testpw',db="test")
c = db.cursor()
c.execute("select * from umlaute")
selectresult = c.fetchall()
for item in selectresult:
umlautfld = item[0]
print umlautfld, len(umlautfld);
for item in selectresult:
umlautfld = item[0]
print (u"%-9s %2s %6s" % (umlautfld, len(umlautfld), "Schief")).encode(sys.stdout.encoding or sys.getfilesystemencoding(), "replace")
ergibt
Code: Alles auswählen
kaj@Birger[kajtajm]$ umlautbeispiel.py
Gemüse 7
Obst 4
München 8
1¾ 3
Herrlich 8
Wunderbar 9
Traceback (most recent call last):
File "./umlautbeispiel.py", line 17, in <module>
print (u"%-9s %2s %6s" % (umlautfld, len(umlautfld), "Schief")).encode(sys.stdout.encoding or sys.getfilesystemencoding(), "replace")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)
Die Daten wurden ordnungsgemäß, erwünscht und recht problemlos als latin1 unter MySQL eingegeben:
Code: Alles auswählen
mysql> use test;
Database changed
mysql> create table umlaute (umlaute char(10));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into umlaute values ("Gemüse"),("Obst"),("München"), ("1¾"), ("Herrlich"), ("Wunderbar");
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from umlaute;
+-----------+
| umlaute |
+-----------+
| Gemüse |
| Obst |
| München |
| 1¾ |
| Herrlich |
| Wunderbar |
+-----------+
6 rows in set (0.00 sec)
mysql> show create table umlaute;
+---------+---------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+---------------------------------------------------------------------------------------------------+
| umlaute | CREATE TABLE `umlaute` (
`umlaute` char(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select umlaute,length(umlaute) from umlaute;
+-----------+-----------------+
| umlaute | length(umlaute) |
+-----------+-----------------+
| Gemüse | 7 |
| Obst | 4 |
| München | 8 |
| 1¾ | 3 |
| Herrlich | 8 |
| Wunderbar | 9 |
+-----------+-----------------+
6 rows in set (0.04 sec)
mysql>
Dass MySQL die Längen von Zeichenketten mit Umlauten genauso falsch berechnet, liegt wohl daran, dass die Daten wie erwünscht in latin1 hinterlegt sind. Die latin1-Daten konnte ich ja auch unter Python lesen, aber nicht mehr in Unicode umwandeln. Ich habe mit sowohl encode als auch decode probiert, mit "utf-8" und mit "latin1" usw. aber der meckert, dass der "ascii decoder" die Umlaute nicht erkennt.
Ich will ja auch sagen, dass es kein "ascii decoder" ist sondern "latin1", gelingt mir aber nicht.
kajarno hat geschrieben:Nicht schief! Jetzt nicht zu früh gefreut - danke!
Code: Alles auswählen
kaj@Birger[kajtajm]$ umlautbeispiel.py
Gemüse 6 Schief
Obst 4 Schief
München 7 Schief
1¾ 2 Schief
Herrlich 8 Schief
Wunderbar 9 Schief