ich habe ein merkwürdiges problem mit verschiedenen kodierungen unter lazarus und das problem ist, das ich das genaue problem einfach nicht verstehe bzw. nicht
erkennen kann, WO es hakt. die ausgangslage ist folgende:
1. ich habe unter win7(deutsch) eine datei in einem verzeichnis liegen. diese heisst "абвгдеж эюя.jpg".
2. in meinem lazarus-programm lese ich den verzeichnissinhalt in eine listbox ein, diese datei wird dann auch korrekt mit ihren kyrillischen buchstaben in der listbox angezeigt.
das heisst ja wohl, das lazarus den string von der system-kodierung korrekt in utf8 umwandelt, denn die lazarus-ide komponenten arbeiten ja alle nur in utf8.
3. ich möchte nun einen kommandozeilenbefehl absetzen, in welchem ich eine externe .exe aufrufe und diesen dateinamen als parameter übergebe. die externe .exe
kann diesen string handeln/beherrscht utf8/16 - wenn ich den befehl manuell auf der konsole absetze, geht das. in lazarus benutze ich das TProcess-objekt, weil ich auch die
rückgabe der .exe auslesen muss. das ganze klappt mit allen "normal" kodierten strings perfekt.
mein problem: ich krieg es nicht hin, an TProcess den korrekt kodierten string zu übergeben, so das er den befehl ausführen kann.
Code: Alles auswählen
oDOSProzess:=TProcess.Create(nil);
oDOSProzess.Options:=oDOSProzess.Options+[poNoConsole, poUsePipes];
oDOSProzess.CommandLine:=UTF8ToSys(sBefehl);
oDOSProzess.Execute;
andere konvertierungsvarianten wie
UTF8Decode, UTF8ToCP850, UTF8ToCP1252 funktionieren auch nicht. entweder sind die kyrillischen zeichen im zielstring weg oder durch fragezeichen ersetzt.
wie kann ich lazarus dazu bringen, das er den umwandlungsprozess des system-strings in utf8(den er ja am anfang beim einlesen korrekt vorgenommen hatte)
genauso in entgegengesetzte richtung zu wiederholen und das ganze so zurückzukodieren, wie er es am anfang eingelesen hat?
wenn ich in meiner windows-konsole(cmd.exe) die aktive codepage mit "chcp" prüfe, sagt er mir es ist die 850. wenn ich hingegen den lazarus-befehl
"GetDefaultTextEncoding" (unit lconvencoding) ausführe, sagt er mir es ist die cp1252.
kann mir irgentjemand erklären, was da GENAU vorgeht? ich blick es nicht mehr.
