![]() |
Unicode über Pipe in Delphi empfangen
Hallo zusammen
In einer bestehenden Delphi-Applikation wird eine in VC++ geschriebene Console-Anwendung mittels 'CreateProcess' gestartet und dessen cout-Meldungen über 'CreatePipe' abgefangen und in eimem TMemo angezeigt. Das klappte in D2007 und ANSI-Text bis anhin ganz gut. Nun habe ich die Aufgabe, die ganze Applikation Unicode-fähig zu machen. D.h. die VC++ Console-Anwendung soll Unicode-Meldungen an das Delphi-GUI senden. Den Delphi-Teil habe ich bereits erfolgreich auf XE migriert. Zum testen der Pipe-Kommunikation habe ich ein einfaches C++ Consoleprogramm (UNICODE) geschrieben, welches folgende Unicode-Meldung (L = Unicode string literal) über wcout absetzt: std::wcout << L"Using wcout: Кирилица èéøÞǽлљΣæča" << std::endl; In einer DOS-Konsole (cmd mit Lucida Unicode Font) wird die Meldung korrekt dargestellt. Ebenso wenn ich den Output mit >> in eine Datei umleite. Wird das Programm aber von Delphi aus gestartet, empfange ich nicht die gewünschten Daten! Wenn ich die empfangenen Daten als buffer of Char (WideChar in XE) behandle, erhalte ich: 獕湩捷畯㩴퀠킚톸킀킸킻톸킆₰ꣃ꧃룃黃뷇믐駑ꏎꛃ跄ൡ Wenn ich die Pipedaten in einen AnsiChar buffer einlese, erhalte ich: Using wcout: Кирилица èéøÞǽлљΣæÄa D.h. zumindest die Chars < 128 werden richtig interpretiert (was auf eine UTF-8 Kodierung hindeutet). Wenn ich die anderen Zeichen als Doppel-Byte interpretiere, erhalte ich Werte im Bereich von $C300-$D1FF welche im chinesischen Bereich von Unicode liegen - sollten aber im kyrillischen Bereich um $0400 liegen. Um das Problem einzugrenzen, habe ich versucht, eine Delphi XE-Konsoleanwendung zu erstellen. Diese ist aber mit WriteLn nicht Unicode-fähig. Hat jemand einen Hinweis oder eine Idee dazu? Besten Dank, Nobby |
AW: Unicode über Pipe in Delphi empfangen
ReadLn und WriteLn sind nunmal NUR Ansi, egal ob zur Console oder zu einer Datei.
Die WideString-Parameter werden dabei intern nach Ansi umgewandelt. Wenn das mit Char/WideChar geht, warum willst du es dann mit einem AnsiChar-Puffer versuchen? Wobei du doch weist, daß WideChar/Uniocode ankommt, also sollte man da auch WideChar und nicht Char verwenden. |
AW: Unicode über Pipe in Delphi empfangen
Das mit WriteLn war ja auch nur ein Test, um das Problem einzugrenzen. AnsiChar habe ich nur verwendet, um die einzelnen Doppel-Bytes, die empfangen werden, zu analysieren. Wenn ich char/WideChar buffer verwende, empfange ich
"獕湩捷畯㩴퀠킚톸킀킸킻톸킆₰ꣃ꧃룃黃뷇믐駑ꏎꛃ跄ൡ" anstatt wie gesendet (und erwartet): "Using wcout: Кирилица èéøÞǽлљΣæča" Die Anzahl der Zeichen stimmt, aber die Interpretierung (Code Page?) nicht. |
AW: Unicode über Pipe in Delphi empfangen
Ahh, jetzt hab ich's verstanden.
Also, so wie es aussieht, sendet dein C-Programm garnicht in Unicode. > Sonst müßten beim ANSI, zwischen den lateinischen Buchstaben, jeweils eine #0 stehen. Könnte UTF-8 sein. Wie sieht/sähe denn dein Code aus, um Ansi zu empfangen? > den entweder so umstellen, daß es in einen AnsiString geht und dann via UTF8Decode nach Unicode umwandeln oder den Text direkt in einen UTF8String rein. |
AW: Unicode über Pipe in Delphi empfangen
Doch das C-Programm sendet den Unicode string:
"Using wcout: Кирилица èéøÞǽлљΣæča" Das hat keine Bedeutung sondern soll nur die korrekte Darstellung überprüfen. Die Pipe (gefüllt vom C-Programm) wird gelesen mit: ReadFile(rPipe, buff, BUFFLEN, read, nil); Ich habe probiert: buff: array [0..BUFFLEN] of AnsiChar; //ANSI und buff: array [0..BUFFLEN] of Char; //Unicode Mit der ersten Version kann ich die einzelnen Bytes überprüfen. Die < 128 stimmen, aber die > 128 liegen im falschen Unicode-Bereich. |
AW: Unicode über Pipe in Delphi empfangen
Kann man die Pipe mittels eines TStringStream auslesen? Die Konvertierung müsste dann klappen.
|
AW: Unicode über Pipe in Delphi empfangen
Guten Morgen
Der empfangene Byte-Buffer ist definitiv UTF-8 kodiert. Mit BabelMap analysiert: ![]() Ich habs nun so hingekriegt: buff: array [0..BUFFLEN] of AnsiChar; rawb: AnsiString; cons: string; //Unicode ... ReadFile(rPipe, buff, BUFFLEN, read, nil); //pipe immer als stream of byte auslesen ... rawb := AnsiString(buff); //byte buffer -> raw byte string (UTF-8) cons := Utf8Decode(rawb); //raw byte string (UTF-8) -> Unicode ... DispConsole(cons); Danke euch allen, Nobby |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz