gpt4 book ai didi

windows - Writeln 是否能够支持 Unicode?

转载 作者:可可西里 更新时间:2023-11-01 12:11:37 25 4
gpt4 key购买 nike

考虑这个程序:

{$APPTYPE CONSOLE}

begin
Writeln('АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ');
end.

我的控制台上使用 Consolas 字体的输出是:

????????Z??????????????????????????????????????

The Windows console is quite capable of supporting Unicode as evidenced by this program:

{$APPTYPE CONSOLE}

uses
Winapi.Windows;

const
Text = 'АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ';

var
NumWritten: DWORD;

begin
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(Text), Length(Text), NumWritten, nil);
end.

输出为:

АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ

可以说服 Writeln 尊重 Unicode,还是它天生就有缺陷?

最佳答案

只需通过代码页 cp_UTF8SetConsoleOutputCP() 例程设置控制台输出代码页。

program Project1;

{$APPTYPE CONSOLE}

uses
System.SysUtils,Windows;
Const
Text = 'АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ';
VAR
NumWritten: DWORD;
begin
ReadLn; // Make sure Consolas font is selected
try
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(Text), Length(Text), NumWritten, nil);
SetConsoleOutputCP(CP_UTF8);
WriteLn;
WriteLn('АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.

输出:

АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ
АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ

WriteLn() 在内部将 Unicode UTF16 字符串转换为选定的输出代码页 (cp_UTF8)。


更新:

以上适用于 Delphi-XE2 及更高版本。在 Delphi-XE 中,您需要显式转换为 UTF-8 才能使其正常工作。

WriteLn(UTF8String('АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ'));

附录:

如果在调用 SetConsoleOutputCP(cp_UTF8) 之前在另一个代码页中完成对控制台的输出,操作系统将无法在 utf-8 中正确输出文本。这可以通过关闭/重新打开标准输出处理程序来解决。

另一种选择是为 utf-8 声明一个新的文本输出处理程序。

var
toutUTF8: TextFile;
...
SetConsoleOutputCP(CP_UTF8);
AssignFile(toutUTF8,'',cp_UTF8); // Works in XE2 and above
Rewrite(toutUTF8);
WriteLn(toutUTF8,'АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ');

关于windows - Writeln 是否能够支持 Unicode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26255148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com