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.

我没有 Delphi 2009 来尝试在编辑器中输入 Unicode 字符串的工作原理......

于 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

Windows 控制台无法显示 unicode 字符,因此请尝试将输出发送到文件:

my_app.exe > unicode_file.txt

并尝试使用良好的文本编辑器查看 unicode_file.txt。

于 2008-11-05T12:44:18.073 回答
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 回答