AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode über Pipe in Delphi empfangen

Ein Thema von nobby · begonnen am 17. Apr 2011 · letzter Beitrag vom 18. Apr 2011
Antwort Antwort
nobby

Registriert seit: 1. Sep 2004
12 Beiträge
 
#1

Unicode über Pipe in Delphi empfangen

  Alt 17. Apr 2011, 15:52
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

AW: Unicode über Pipe in Delphi empfangen

  Alt 17. Apr 2011, 16:04
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
nobby

Registriert seit: 1. Sep 2004
12 Beiträge
 
#3

AW: Unicode über Pipe in Delphi empfangen

  Alt 17. Apr 2011, 16:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

AW: Unicode über Pipe in Delphi empfangen

  Alt 17. Apr 2011, 17:05
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Apr 2011 um 17:07 Uhr)
  Mit Zitat antworten Zitat
nobby

Registriert seit: 1. Sep 2004
12 Beiträge
 
#5

AW: Unicode über Pipe in Delphi empfangen

  Alt 17. Apr 2011, 17:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Unicode über Pipe in Delphi empfangen

  Alt 18. Apr 2011, 08:21
Kann man die Pipe mittels eines TStringStream auslesen? Die Konvertierung müsste dann klappen.
  Mit Zitat antworten Zitat
nobby

Registriert seit: 1. Sep 2004
12 Beiträge
 
#7

AW: Unicode über Pipe in Delphi empfangen

  Alt 18. Apr 2011, 08:37
Guten Morgen

Der empfangene Byte-Buffer ist definitiv UTF-8 kodiert.
Mit BabelMap analysiert: http://www.babelstone.co.uk/Software/BabelMap.html

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz