Frage

Ich habe Konsolenanwendung. geschrieben in Delphi 2010. Es ist Ausgabe ist Unicode unterstützt. (I verwendet UTF8Encode und SetConsoleOutputCP (CP_UTF8) für diese). Wenn ich das Programm von Eingabeaufforderung funktioniert es gut.
Jetzt möchte ich die Ausgabe von einem anderen Programm lesen, die in erstellt wurde Delphi 5 . Ich benutze Methode href="https://stackoverflow.com/questions/1212176/delphi-6-read-console-apps-output-while-running/1212378#1212378">. Aber ich habe Probleme mit Unicode-Zeichen.
Hat jemand eine Empfehlung, die Unicode-Ausgabe von Konsolenanwendung zu lesen. von Delphi 5?

Andere Tipps

Delphi 5 tut Unicode-Unterstützung, sondern nur durch die Wide UTF-16 (-LE) kodiert. Nativ, wird D5 nicht UTF-8-Unterstützung hat.

Sie können die Ausgabe Ihrer D2010 Konsole App in der Art und Weise lesen Sie bereits tun, obwohl ich die OemToAnsi Umwandlung würde herausnehmen. OemToAnsi wurde (in D5 Tagen noch) ersetzt durch OEMToChar die verwendet werden können OEM-Zeichen zu Ansi (Single-Byte-Zeichen mit verschiedenen Codepages) oder Wide (UTF-16-LE Unicode) zu konvertieren, aber es wird eine Sache nicht tun, um interpretiert das UTF-8-Bytes kommen und könnte nur durcheinander zu bringen.

Was Sie brauchen, ist eine Reihe von Funktionen, die Sie alle „raw“ utf-8 Bytes aus dem Rohr lesen nehmen und wandeln sie in (UTF-16-LE codiert) Wide, die Sie dann zu einer Steuer einspeisen das dauert in und zeigt Wide. Alternativ können Sie für eine Kontrolle suchen, die die „rohen“ Byte Interpretation tut und Konvertierung alle selbst, aber ich muss zugeben, ich habe nicht allein gesehen lassen, dass noch D5 unterstützt.

Eine Bibliothek, die viele verschiedene Kodierungen umwandeln und unterstützt noch D5 ist DIUnicode:

Sie haben zwei Probleme mit Delphi 5 mit Unicode-Output.

Die erste ist TMemo nicht Unicode-Zeichen unterstützen Sie ein anderes Steuerelement finden müssen, wie die, die in TMS Unicode Component Pack-. Allerdings ist diese Komponente Pack nicht unterstützt Delphi 5.

Das zweite Problem ist mit diesem Teil des Codes:

  repeat
    BytesRead := 0;
    ReadFile(ReadPipe,Buffer[0],
    ReadBuffer,BytesRead,nil) ;
    Buffer[BytesRead]:= #0;
    OemToAnsi(Buffer,Buffer) ;
    AMemo.Text := AMemo.text + String(Buffer) ;
  until (BytesRead < ReadBuffer) ;

Es ist ihm Zeichen zu lesen und sie in dem Puffer platziert, die ein PCHAR (einzelnes Zeichen pro Byte in D5) Geben Sie dann diese Zeichenfolge zu einem Casting, die ein Ansistring in D5 ist.

Obwohl ich D5 seit Jahren nicht mehr benutzt habe, die einzige Art, dass ich mich erinnern kann, dass Unicode-Daten in D5 handhaben kann, ist Wide.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top