[Python-de] subprocess und encoding...

Diez B. Roggisch deets at web.de
Mon Jun 19 10:58:03 CEST 2006


On Monday 19 June 2006 09:29, Jens Diemer wrote:
> Ich möchte per subprocess das Programm mysqldump benutzten. Das klappt
> Grundsätzlich schon, allerdings hab ich Probleme mit dem Encoding. Ich
> möchte die Ausgaben gern nach unicode wandeln.
>
> Ich hab gesehen das subprocess.PIPE (also process.stdout) ein encoding
> Attribut besitzt. Leider ist das aber == None ;(
>
> Ansonsten Probiere ich einfach ["ASCII", "latin1", "utf8"] durch. ASCII
> klappt natürlich immer dann, wenn keine Umlaute vorkommen. Aber sind
> welche enthalten klappt es auch mit latin1 und utf8 nicht.

Diie Reihenfolge ist unsinnig. du solltest zuerst utf8 und DANN latin1 
probieren (wenn du schon probierst). Dann latin1 ist ein byte-encoding, und 
alles was du dem gibts schluckt es auch. 

> mysqldump hat den Parameter default-character-set:
> """
> Use charset_name as the default character set. See Section 5.10.1, "The
> Character Set Used for Data and Sorting". If not specified, mysqldump
> from MySQL 4.1.2 or later uses utf8, and earlier versions use latin1.
> """
> http://dev.mysql.com/doc/refman/4.1/en/mysqldump.html
>
> Egal ob ich default-character-set auf utf8 oder latin1 stelle, das
> wandeln in unicode klappt in Python nicht...

Ohne das du uns Daten und/oder code zeigst kann man das nicht einschätzen.

> Am Ende bleibt mir nicht's anderes übrig als aus Ausgaben mit
> errors="replace" in unicode zu wandeln, aber das Ergebniss hat dann
> natürlich statt Umlaute nur noch Fragezeichen :(
>
> Nun also zwei Fragen:
> -Was kann ich tun damit ein definierter Codec benutzt wird?

Du kannst den stream wrappen mittes des codecs modules. Das klappt aber nur, 
wenn mysqldump korrekte Daten liefert.

> -Kann ich die Ausgaben irgendwie als RAW-Daten in unicode bringen? Also
> eine Alternative zu errors="replace" ?

Natürlich nicht! Wenn es dir egal ist (so scheints ja), dann bleib doch 
einfach bei byte-strings. Da kannst du allen Ranz mit transportieren.

Ich bin mir nicht sicher, wie mysql funtkioniert - aber es könnte sein, das du 
schon falsch codierte Daten in der datenbank hast. Wenn das der Fall ist, 
dann musst du eben probieren. Oder die Daten bereinigen.

MfG Diez