Wiedermal encoding Probleme

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Ich habe wiedermal encoding Probleme mit meinem Proggi trotz eingehendem Studiums der Encoding Tutorials :-)
Das mit den Strings die ich erzeuge krieg ich schon ganz gut hin. Nun habe ich aber folgendes Problem:
Ich habe da einen String, der durch verschiedene Funktionen gejagt wird und dann an ein Programm übergeben wird. Anfangs ist er sicher unicode, aber irgendwie habe ich das Gefühl, dass er das am Schluss nicht mehr ist.
Wie kann ich denn eigentlich feststellen welches Encoding (oder ob er unicode ist) der String zum Zeitpunkt hat an dem ich ihn zum Proggi schicke um auf Fehlersuche zu gehen? Wenn ich ihn mit print ausgebe, dann encodet Python ihn ja automatisch was ich mitbekommen habe.

Und vielleicht gleich noch zum Problem an sich: Mir haut ein String mit Umlauten den ich an ein Proggi schicke am einen Compi an dem Latin1 eingestellt ist hin und am anderen an dem UTF8 eingestellt ist nicht. Wie ist denn der String korrekt an subprocess.Popen zu übergeben? Als unicode, oder im jeweiligen Encoding?

Echt nervig diese Encoding Geschichten :-(
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Ich glaube den ersten Teil habe ich schon herausgefunden:
Ich schreibe

Code: Alles auswählen

print [string,]
Dann sehe ich welches Encoding der String hat. Das gibt mir aus:

Code: Alles auswählen

[u'/home/seppl/tmp/Bildung/Englisch_f\xfcr_Anf\xe4nger/(31#2f51)_The_election_campaign/2007-08-31.07.15.50.99.rec']
Es sollte also ein unicode String sein. Nur wie übergebe ich den nun an das Programm, dass es korrekt läuft? Als unicode klappts nicht:

Code: Alles auswählen

proc=subprocess.Popen("Proggi "+string)
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo,

Prüfen:

Code: Alles auswählen

In [9]: isinstance(u"huhu", unicode)
Out[9]: True

In [10]: isinstance("huhu", unicode)
Out[10]: False
Umwandeln in String:

Code: Alles auswählen

In [12]: u"huhu".encode("utf-8")
Out[12]: 'huhu'

In [13]: isinstance(u"huhu".encode("utf-8"), str)
Out[13]: True
Edit: utf-8 soll nur so als Beispiel gelten. Es kommt natürlich darauf an mit welcher Codierung gearbeitet wird.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Achtung, Stolzi: das ist eben wo die meisten Probleme mit Unicode und Bytestrings haben (ich anfangs auch, bis ich das geblickt habe).

Es sieht nämlich so aus, dass es Bytestrings und Unicode-Strings gibt. *Jede* Interaktion mit "außerhalb" des Programmes (des Python-Prozesses) muss über Bytestrings stattfinden - Unicode ist nur im Speicher gültig, man kann es nicht in Dateien anspeichern oder ähnliches. Dazu musst du den Unicode-String immer erstmal durch ein Encoding in einen Bytestring wandelt. Oft ist das UTF-8, weil es alle Unicode-Zeichen darstellen kann und speicherplatzsparend ist. Manchmal ist es Latin-1, wenn du Sonderzeichen hast und die Daten von einem Programm verarbeitet werden sollten, dass es nicht so mit UTF-8 hat. Manchmal ist es aber auch ASCII, nur dann dürfen keine Sonderzeichen vorkommen, sonst krachts.

Und besonders merken: Auch wenn man oft Ausdrücke wie "Unicode (UTF-8)" sieht - Unicode und UTF-8 sind nicht das gleiche. UTF-8 ist nur das populärste Encoding in dem man Unicode speichern kann. Aber man kann quasi aus jedem Bytestring Unicode machen, andersrum geht das nicht immer, da hängt das schon vom Inhalt des Unicode-Strings ab (Sonderzeichen etc).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Danke euch. Verstehe ich soweit.
Nur eine Sache kriege ich einfach nicht hin.... Ich rufe in meinem Skript erst projectx und dann avidemux mit shutil popen auf.
In Linux klappt folgender Aufruf super (Daten die an subprocess.Popen gesendet werden per print ausgegeben):

Code: Alles auswählen

['/usr/bin/projectx.sh', '-demux', '-out', u'/home/stolzi/tmp2/Disneys_Kuzco#27s_K\xf6nigsklasse/2007-09-02.11.15.50.99.rec', '-name', 'px', u'/home/stolzi/tmp2/Disneys_Kuzco#27s_K\xf6nigsklasse/2007-09-02.11.15.50.99.rec/001.vdr']

['/usr/local/bin/avidemux2_gtk', '--autoindex', '--audio-codec', 'MP3', '--video-codec', 'XVID4', '--video-conf', 'cq=6', '--output-format', 'AVI', '--load', u'/home/stolzi/tmp2/Disneys_Kuzco#27s_K\xf6nigsklasse/2007-09-02.11.15.50.99.rec/px.m2v', '--external-mp3', u'/home/stolzi/tmp2/Disneys_Kuzco#27s_K\xf6nigsklasse/2007-09-02.11.15.50.99.rec/px.mp2', '--save', u'/home/stolzi/tmp2/Disneys_Kuzco#27s_K\xf6nigsklasse/2007-09-02.11.15.50.99.rec/output.avi.part', '--quit']
Das heisst ich sende hier die heiklen Daten einfach per unicode an subprocess.Popen. Das Klappt in Linux, ob systemweit UTF8, oder latin1 als encoding eingestellt ist. In Windows gehts aber nicht... :-( Er schreibt da dann was von "'ascii' codec can't encode" und bricht ab.
Ich hab dann probiert die Pfade mit latin1 zu encoden. Der Aufruf von ProjectX funzt dann, aber Avidemux geht immer noch nicht. Avidemux findet die Datei nicht. Auch mit utf8 zu encoden habe ich versucht, genauso wie sys.stdout.encoding... geht alles nicht.
Warum funktioniert denn das mit projectx, aber avidemux nicht? Was könnte ich denn noch probieren um herauszufinden wie avidemux den Pfad gerne haben möchte?

Bin am Ende mit meinen Ideen :-/
Danke
Stolzi
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Genau... sys.getfilesystemencoding() habe ich natürlich auch probiert. Aber Avidemux2 meldet genauso: "Kann /home/stolzi/tmp2/Disneys_Kuzco#27s_K?nigsklasse/2007-09-02.11.15.50.99.rec nicht öffnen"
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Stolzi hat geschrieben:Genau... sys.getfilesystemencoding() habe ich natürlich auch probiert. Aber Avidemux2 meldet genauso: "Kann /home/stolzi/tmp2/Disneys_Kuzco#27s_K?nigsklasse/2007-09-02.11.15.50.99.rec nicht öffnen"
Hallo Stolzi!

Umgehe das Problem: Ändere zuerst den Dateinamen so um, dass keine Umlaute und Leerzeichen im Pfad sind. Danach kannst du ja alles wieder zurück ändern.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Jo, hast recht... Hätt ich gleich so machen sollen. Danke dir!
Antworten