(erledigt)[WinAPI] UTF-8-Kommandozeile für CreateProcess()

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(erledigt)[WinAPI] UTF-8-Kommandozeile für CreateProcess()

Beitrag von Krishty »

Huhu,

ExifTool erwartet seine Parameter UTF-8-kodiert. Ich rufe es allerdings via CreateProcessW() auf, welches die Kommandozeile in UTF-16 erwartet. Zusammengefasst:

Was soll ich jetzt tun?

Die ANSI-Version (CreateProcessA()) bringt nichts, weil sie intern die Kommandozeile von der System Codepage zu UTF-16 konvertiert. Überhaupt verstehe ich nicht, wie ich die Daten übergeben soll:
  • Ich habe meinen Dateinamen in UTF-16
  • Ich konvertiere ihn zu UTF-8
  • Irgendwie muss ich ihn jetzt in die UTF-16-WinAPI füttern, damit die ihn an das Tool übergibt
  • Das Tool erhält seine Kommandozeile ebenfalls in UTF-16 (weil es unter der WinAPI gar nicht anders geht), scheint sie aber entweder durch die CRT oder selber zu UTF-8 zurückzukonvertieren
Und jetzt soll ich meine UTF-8-Konvertierung so vornehmen, dass die einzelnen Bytes zu UTF-16 konvertiert und wieder zurückkonvertiert werden können, ohne Information zu verlieren, oder was? :( Meine Beobachtungen so weit:
  • Den UTF-16-Dateinamen reinfüttern bewirkt ein totales Fuckup bei Sonderzeichen
  • UTF-16, das ausschließlich ASCII-Zeichen enthält, funktioniert fehlerfrei
Einschätzungen? Werden die einzelnen WCHARs vielleicht einfach nur zu BYTEs abgeschnitten?
Zuletzt geändert von Krishty am 01.10.2015, 22:10, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
zero84
Beiträge: 11
Registriert: 30.09.2004, 10:31
Alter Benutzername: zero84

Re: [WinAPI] UTF-8-Kommandozeile für CreateProcess()

Beitrag von zero84 »

In UTF-8, every code point from 0-127 is stored in a single byte. Only code points 128 and above are stored using 2, 3, in fact, up to 6 bytes.
Das mal so als Anhaltspunkt. Dieses und mehr interessantes Hintergrundwissen gibt's hier:
http://www.joelonsoftware.com/articles/Unicode.html
(vielleicht findet sich die ein oder andere neue Info für dich die du verwenden kannst)
Den UTF-16-Dateinamen reinfüttern bewirkt ein totales Fuckup bei Sonderzeichen
Welches Encoding verwendest du denn?
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] UTF-8-Kommandozeile für CreateProcess()

Beitrag von Krishty »

zero84 hat geschrieben:
In UTF-8, every code point from 0-127 is stored in a single byte. Only code points 128 and above are stored using 2, 3, in fact, up to 6 bytes.
Das mal so als Anhaltspunkt. Dieses und mehr interessantes Hintergrundwissen gibt's hier:
http://www.joelonsoftware.com/articles/Unicode.html
(vielleicht findet sich die ein oder andere neue Info für dich die du verwenden kannst)
Danke!
zero84 hat geschrieben:
Den UTF-16-Dateinamen reinfüttern bewirkt ein totales Fuckup bei Sonderzeichen
Welches Encoding verwendest du denn?
UTF-16 :) Das Tool interpretiert es dann als was anderes (sieht so ein Bisschen nach der Konsolenfenster-Codepage aus).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
zero84
Beiträge: 11
Registriert: 30.09.2004, 10:31
Alter Benutzername: zero84

Re: [WinAPI] UTF-8-Kommandozeile für CreateProcess()

Beitrag von zero84 »

UTF-16 :) Das Tool interpretiert es dann als was anderes (sieht so ein Bisschen nach der Konsolenfenster-Codepage aus).
Uiuiui :D Das klingt als würde es umständlich werden...
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: [WinAPI] UTF-8-Kommandozeile für CreateProcess()

Beitrag von Spiele Programmierer »

Erstmal müsstest du herausfinden, wie das Tool genau die Daten interpretiert. Für ein einfaches Verständnis von UTF-8 ist Wikipedia völlig ausreichend. Da es sich hier jedoch um einen Fehler handelt und die Zeichendaten in der Anwendung offensichtlich nicht richtig verarbeitet werden, ist das natürlich nur begrenzt hilfreich. Und es gibt es prinzipiell eine unbegrenzte Fülle an Möglichkeiten an Dingen, die falsch alle können. Insbesondere auch, dass es einfach gar nicht funktionieren kann.

Das "wchar_t*" direkt als "char*" interpretiert wurde, kann eigentlich nicht sein, denn dann wäre jedes zweite Zeichen in der Anwendung ein Null-Char wäre. ASCII würde dann auch nicht funktionieren. Falls du denkst, dass aus dem "wchar_t" jeweils die oberen 8 Bits abgeschnitten werden und die unteren 8 Bit als UTF-8 interpretiert werden, wäre das sehr einfach auszuprobieren, in dem du deinen in UTF-8 formatierten Text zeichenweise einfach in ein "wchar_t"-Array kopierst.

Etwas wahrscheinlicher halte ich es, dass die Anwendung Windows ANSI als UTF-8 interpretiert. Das sollte dann allerdings funktionieren, wenn du deinen UTF-8 String als ANSI übergibst. Ich weiß jetzt gerade nicht ganz sicher wie ANSI genau definiert ist und ich vermute, dass es auch von den Locale Einstellungen abhängt. Allerdings denke ich, dass die Konvertierung zu Unicode verlustfrei ablaufen sollte:
ANSI(Tatsächlich UTF-8) -> UTF-16 -> binär identischer ANSI (Tatsächlich UTF-8) String

Wenn beides nicht funktioniert, wird es etwas anderes sein. Ich würde mir an deiner Stelle mal genau anschauen, welche Codepoints tatsächlich am Bildschirm abhänig von denen erscheinen, die du mit verschiedenen Methoden zu übergeben versucht.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] UTF-8-Kommandozeile für CreateProcess()

Beitrag von Krishty »

Ich versuche gerade einen Workaround: Der Verfasser des Tools meint, es sei einfacher, alle Parameter in eine UTF-8-kodierte Textdatei zu schreiben und *die* dem Programm mit einem speziellen Parameter zu übergeben. Ich probier’s gerade.
Spiele Programmierer hat geschrieben:Das "wchar_t*" direkt als "char*" interpretiert wurde, kann eigentlich nicht sein, denn dann wäre jedes zweite Zeichen in der Anwendung ein Null-Char wäre. ASCII würde dann auch nicht funktionieren.
Ja genau; das auf keinen Fall.
Falls du denkst, dass aus dem "wchar_t" jeweils die oberen 8 Bits abgeschnitten werden und die unteren 8 Bit als UTF-8 interpretiert werden, wäre das sehr einfach auszuprobieren, in dem du deinen in UTF-8 formatierten Text zeichenweise einfach in ein "wchar_t"-Array kopierst.
Das habe ich direkt nach Verfassen des vorherigen Posts gemacht, und das Ergebnis ist ein wenig aussagekräftiges No wildcards allowed. Ich habe dann einfach mal Chinesisch reingefüttert, und die Meldung ist Invalid filename encoding for å??æ°?.jpg. Es wäre ja hilfreich, wenn ich zumindest mal die Kommandozeile aus Sicht des Tools in eine Datei kriegen würde, aber das wird wohl nichts.
Etwas wahrscheinlicher halte ich es, dass die Anwendung Windows ANSI als UTF-8 interpretiert. Das sollte dann allerdings funktionieren, wenn du deinen UTF-8 String als ANSI übergibst.
Ich weiß nicht recht, wie das gemeint ist, aber man kann in der WinAPI nichts als ANSI übergeben. Alle ANSI-Parameter werden intern nach UTF-16 konvertiert und dann erst weitergereicht. Ich müsste herausfinden, ob das Tool die WinAPI oder CRT nutzt, um die Kommandozeile für main() wieder in was anderes zu konvertieren, und wie die Konvertierung abläuft. Puh.
Ich weiß jetzt gerade nicht ganz sicher wie ANSI genau definiert ist und ich vermute, dass es auch von den Locale Einstellungen abhängt. Allerdings denke ich, dass die Konvertierung zu Unicode verlustfrei ablaufen sollte:
ANSI(Tatsächlich UTF-8) -> UTF-16 -> binär identischer ANSI (Tatsächlich UTF-8) String
Und da dann doch erstmal der Workaround mit der Datei :D
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: [WinAPI] UTF-8-Kommandozeile für CreateProcess()

Beitrag von Spiele Programmierer »

Ich weiß nicht recht, wie das gemeint ist, aber man kann in der WinAPI nichts als ANSI übergeben.
Das mag sein, allerdings könnte es eben sein, dass die Anwendung UTF-16 wieder in ANSI konvertiert entgegennimmt. Ob es intern mal als ANSI interpretiert in UTF-16 umgewandelt wurde, sollte egal sein.
Es wäre ja hilfreich, wenn ich zumindest mal die Kommandozeile aus Sicht des Tools in eine Datei kriegen würde, aber das wird wohl nichts.
Du könntest doch den falschen Dateinamen in eine Datei schreiben?
http://www.robvanderwoude.com/redirection.php

Wenn die Option mit einer temporären Datei besteht, ist das natürlich einfacher.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] UTF-8-Kommandozeile für CreateProcess()

Beitrag von Krishty »

Output Redirection habe ich schon, allerdings gibt das Tool ganz banal seine Kommandozeile nicht wieder aus :(
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (erledigt)[WinAPI] UTF-8-Kommandozeile für CreateProcess

Beitrag von Krishty »

Der Workaround über die UTF-8-Datei klappt – und dabei bleibe ich jetzt auch. Danke trotzdem für die Hilfe!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten