10

Delphi 2009 で Unicode コンソール アプリケーションを作成するにはどうすればよいですか?

私がこれを好きなら:

{$APPTYPE CONSOLE}
uses
  SysUtils;
begin
  writeln('öüğşç سيمانتت');
end.

私は以下を取得します:

ougsc ???????
4

6 に答える 6

11

Delphi 2009 の Writeln は引き続き ANSI を使用しますが(System TTextRec を参照)、UTF8Encode を使用し、SetConsoleOutputCP(CP_UTF8) を呼び出してコンソールの出力コード ページを UTF8 に変更できます。実際に Unicode 文字を表示するには、適切なフォントも必要です。

于 2008-11-06T10:17:23.580 に答える
9

それがあなたの求めているものかどうかはわかりませんが、Windows API 関数を使用して、すべての 32 ビット Delphi バージョンで Unicode コンソール アプリケーションを作成できます。Delphi 4で試しました:

program test;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  s: WideString;
  i: integer;
  Written: Cardinal;
begin
  SetLength(s, 80);
  for i := 1 to 80 do
    s[i] := WideChar(48 + i);
  WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), PWideChar(s), 80, Written,
    nil);
end.

エディタで Unicode 文字列を入力する方法を試す Delphi 2009 がありません...

于 2008-11-05T19:36:34.763 に答える
5

できません(少なくとも標準ライブラリではできません)。コンソール関数は、Delphi 2009 で唯一の非 Unicode 関数です。

于 2008-11-05T12:44:06.763 に答える
1

@Kabrol: ラスター フォント セットではどちらの文字も表示されませんが、Lucida Console では少なくとも widechar($11f) - "ğ" が表示されます。

「SetConsoleOutputCP は Unicode フォントでのみ有効」と、 「コンソール リファレンス」の一般的なコンソール API 関数の説明を参照してください。

于 2008-11-06T08:23:08.007 に答える
0

実際には、標準の WriteLn() 呼び出しでこれを行う方法がありますが、Delphi 2009 RTL のバグにパッチを当てる必要があります。問題は、Delphi が WriteLn に対していくつかのコンパイラ マジックを実行することです。UnicodeString 引数の場合、_WriteUString が呼び出されます。このメソッドは System.pas で確認できますが、直接呼び出すことはできません。その中で _WriteLString への呼び出しが表示されますが、そのメソッドは AnsiString 引数を受け取ります。したがって、この呼び出しが行われているとき、UnicodeString は AnsiString にダウンキャストされています。

解決策は、この UnicodeString->AnsiString キャストを UnicodeString->UTF8String キャストに変更することです。

ここで、コンソールを UTF8 に設定すると、すべての文字がそのまま処理されます (もちろん、表示したい文字をサポートするフォントが必要です):

SetConsoleOutputCP(CP_UTF8)

この RTL を修正するには、気の利いたコード フックを行う必要があります。私はすでにこれを行っており、私の同僚はこれについての記事を書くのに忙しい. オンラインで利用可能になったら、リンクを投稿します。

乾杯!

于 2008-11-10T15:48:33.507 に答える
0

Windows コンソールは Unicode 文字を表示できないため、次のように出力をファイルに送信してみてください。

my_app.exe > unicode_file.txt

適切なテキスト エディタで unicode_file.txt を表示してみてください。

于 2008-11-05T12:44:18.073 に答える