Delphi 2009中的Unicode控制台应用程序

时间:2008-11-05 12:36:32

标签: delphi unicode console delphi-2009

如何使用Delphi 2009创建unicode控制台应用程序?

如果我喜欢这样:

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

我得到以下内容:

ougsc ???????

6 个答案:

答案 0 :(得分:11)

Delphi 2009中的Writel仍然使用ANSI(请参阅System TTextRec),但您可以使用UTF8Encode并通过调用SetConsoleOutputCP(CP_UTF8)将控制台的输出代码页更改为UTF8。您还需要一个好的字体来实际显示Unicode字符。

答案 1 :(得分: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.

我没有Delphi 2009来尝试如何在编辑器中输入Unicode字符串...

答案 2 :(得分:5)

你不能(至少没有标准库)。控制台功能是Delphi 2009中唯一的非Unicode功能。

答案 3 :(得分:1)

@Kabrol:使用光栅字体集我没有看到任何一个字符,但是使用Lucida Console我至少看到了widechar($ 11f) - “ğ”。

请参阅"SetConsoleOutputCP Only Effective with Unicode Fonts"以及"Console Reference"处的控制台API函数的一般说明。

答案 4 :(得分:0)

Windows控制台无法显示unicode字符, 所以尝试使用以下命令将输出发送到文件:

my_app.exe > unicode_file.txt

并尝试使用优秀的文本编辑器查看unicode file.txt。

答案 5 :(得分:0)

实际上,有一种方法可以使用标准的WriteLn()调用来完成此操作,但它涉及修补Delphi 2009 RTL中的错误。 问题是,Delphi为WriteLn做了一些编译魔术。对于UnicodeString参数,这会导致对_WriteUString的调用。可以在System.pas中看到该方法,但您无法直接调用它。在其中,您将看到对_WriteLString的调用,但该方法接收AnsiString参数。因此,当进行此调用时,您的UnicodeString将被下载到AnsiString。

解决方法是,将此UnicodeString-> AnsiString强制转换为UnicodeString-> UTF8String强制转换。

现在,当您将控制台设置为UTF8时,您的所有角色都将不受影响(是的,当然,您需要一个支持您想要显示的角色的字体):

SetConsoleOutputCP(CP_UTF8)

对于这个RTL修复,你需要做一些漂亮的代码挂钩。我已经这样做了,我的一个同事正在忙着写一篇关于这个的文章。我会在网上发布一个链接。

干杯!