1

私はコンソールアプリを持っています。Delphi 2010 で書かれています。出力は Unicode をサポートしています。(これには UTF8Encode と SetConsoleOutputCP(CP_UTF8) を使用しました)。コマンドプロンプトからプログラムを実行すると、正常に動作します。Delphi 5
で作成された別のプログラムからの出力を読みたいと思います。私はこの方法を使用します。しかし、ユニコード文字に問題があります。 コンソールアプリのユニコード出力を読むための推奨事項はありますか? Delphi 5から?

4

3 に答える 3

1

Delphi 5はUnicodeをサポートしていますが、UTF-16(-LE)でエンコードされたWideStringを介してのみサポートされます。本来、D5はUTF-8をサポートしていません。

OemToAnsi変換を削除しますが、D2010コンソールアプリの出力を既に行った方法で読み取ることができます。OEMToAnsiは、OEM文字をAnsi(さまざまなコードページを使用する1バイト文字)またはWideString(UTF-16-LE Unicode)に変換するために使用できるOEMToCharに置き換えられました(D5日でも)が、入ってくるUTF-8バイトを解釈し、物事を台無しにする可能性があります。

必要なのは、パイプから読み取ったすべての「生の」utf-8バイトを取得し、それらを(UTF-16-LEでエンコードされた)WideStringに変換して、取得できるコントロールにフィードできる一連の関数です。で、WideStringsを表示します。あるいは、「生の」バイトの解釈と変換をすべて実行するコントロールを探すこともできますが、D5をサポートしているコントロールはもちろんのこと、見たことがないことを認めなければなりません。

多くの異なるエンコーディングを変換でき、それでもD5をサポートできるライブラリはDIUnicodeです:http ://www.wikitaxi.org/delphi/doku.php/products/unicode/index

于 2010-05-18T19:03:59.773 に答える
0

Unicode 出力で Delphi 5 を使用する場合、2 つの問題があります。

1 つ目は、TMemo は Unicode 文字をサポートしていないため、 TMS Unicode Component Packなどの別のコントロールを見つける必要があります。ただし、このコンポーネント パックは Delphi 5 をサポートしていません。

2 番目の問題は、コードのこの部分にあります。

  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) ;

文字を読み取り、それらを PCHAR (D5 では 1 バイトあたり 1 文字) であるバッファに配置します。次に、これを D5 の AnsiString である文字列に型キャストします。

私は D5 を何年も使用していませんが、D5 で Unicode データを処理できる唯一の記憶可能な型は WideString です。

于 2010-05-18T15:29:37.030 に答える
-1

次のように何かを変更しましたが、正常に動作します:
コンソール アプリケーションでは、SetConsoleOutputCP(CP_UTF8) を使用しませんでした。文字列出力のみを使用します...
そして、他のプログラム(Delphi 5)では、OemToChar(Buffer,Buffer)を使用せずにこの関数を使用します

于 2010-07-13T06:59:35.940 に答える