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
Wiedermal encoding Probleme
Ich glaube den ersten Teil habe ich schon herausgefunden:
Ich schreibe
Dann sehe ich welches Encoding der String hat. Das gibt mir aus:
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:
Ich schreibe
Code: Alles auswählen
print [string,]
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']
Code: Alles auswählen
proc=subprocess.Popen("Proggi "+string)
Hallo,
Prüfen:
Umwandeln in String:
Edit: utf-8 soll nur so als Beispiel gelten. Es kommt natürlich darauf an mit welcher Codierung gearbeitet wird.
Prüfen:
Code: Alles auswählen
In [9]: isinstance(u"huhu", unicode)
Out[9]: True
In [10]: isinstance("huhu", unicode)
Out[10]: False
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
-
- 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).
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
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):
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
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']
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
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Stolzi!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"
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.