如何使用Delphi 2009创建unicode控制台应用程序?
如果我喜欢这样:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
writeln('öüğşç سيمانتت');
end.
我得到以下内容:
ougsc ???????
答案 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修复,你需要做一些漂亮的代码挂钩。我已经这样做了,我的一个同事正在忙着写一篇关于这个的文章。我会在网上发布一个链接。
干杯!