Delphi 2009 で Unicode コンソール アプリケーションを作成するにはどうすればよいですか?
私がこれを好きなら:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
writeln('öüğşç سيمانتت');
end.
私は以下を取得します:
ougsc ???????
Delphi 2009 で Unicode コンソール アプリケーションを作成するにはどうすればよいですか?
私がこれを好きなら:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
writeln('öüğşç سيمانتت');
end.
私は以下を取得します:
ougsc ???????
Delphi 2009 の Writeln は引き続き ANSI を使用しますが(System TTextRec を参照)、UTF8Encode を使用し、SetConsoleOutputCP(CP_UTF8) を呼び出してコンソールの出力コード ページを UTF8 に変更できます。実際に Unicode 文字を表示するには、適切なフォントも必要です。
それがあなたの求めているものかどうかはわかりませんが、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 がありません...
できません(少なくとも標準ライブラリではできません)。コンソール関数は、Delphi 2009 で唯一の非 Unicode 関数です。
@Kabrol: ラスター フォント セットではどちらの文字も表示されませんが、Lucida Console では少なくとも widechar($11f) - "ğ" が表示されます。
「SetConsoleOutputCP は Unicode フォントでのみ有効」と、 「コンソール リファレンス」の一般的なコンソール API 関数の説明を参照してください。
実際には、標準の WriteLn() 呼び出しでこれを行う方法がありますが、Delphi 2009 RTL のバグにパッチを当てる必要があります。問題は、Delphi が WriteLn に対していくつかのコンパイラ マジックを実行することです。UnicodeString 引数の場合、_WriteUString が呼び出されます。このメソッドは System.pas で確認できますが、直接呼び出すことはできません。その中で _WriteLString への呼び出しが表示されますが、そのメソッドは AnsiString 引数を受け取ります。したがって、この呼び出しが行われているとき、UnicodeString は AnsiString にダウンキャストされています。
解決策は、この UnicodeString->AnsiString キャストを UnicodeString->UTF8String キャストに変更することです。
ここで、コンソールを UTF8 に設定すると、すべての文字がそのまま処理されます (もちろん、表示したい文字をサポートするフォントが必要です):
SetConsoleOutputCP(CP_UTF8)
この RTL を修正するには、気の利いたコード フックを行う必要があります。私はすでにこれを行っており、私の同僚はこれについての記事を書くのに忙しい. オンラインで利用可能になったら、リンクを投稿します。
乾杯!
Windows コンソールは Unicode 文字を表示できないため、次のように出力をファイルに送信してみてください。
my_app.exe > unicode_file.txt
適切なテキスト エディタで unicode_file.txt を表示してみてください。