私はコンソールアプリを持っています。Delphi 2010 で書かれています。出力は Unicode をサポートしています。(これには UTF8Encode と SetConsoleOutputCP(CP_UTF8) を使用しました)。コマンドプロンプトからプログラムを実行すると、正常に動作します。Delphi 5
で作成された別のプログラムからの出力を読みたいと思います。私はこの方法を使用します。しかし、ユニコード文字に問題があります。
コンソールアプリのユニコード出力を読むための推奨事項はありますか? Delphi 5から?
3 に答える
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
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 です。
次のように何かを変更しましたが、正常に動作します:
コンソール アプリケーションでは、SetConsoleOutputCP(CP_UTF8) を使用しませんでした。文字列出力のみを使用します...
そして、他のプログラム(Delphi 5)では、OemToChar(Buffer,Buffer)を使用せずにこの関数を使用します