当我试图在Delphi XE7控制台应用程序中显示UTF 8文本时,我面临着一个愚蠢而烦人的情况。 似乎ReadLn命令在第二次尝试后才读取正确的UTF 8字符。例如:
program ConsTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Classes,
WinApi.Windows;
var
CurrentCodePage: Integer;
Command: String;
Running: Boolean;
MyText: String;
begin
CurrentCodePage := GetConsoleOutputCP;
SetConsoleOutputCP(CP_UTF8);
SetTextCodePage(Output, CP_UTF8);
MyText := 'Olá mundo.';
WriteLn(MyText);
Running := True;
while Running do
begin
ReadLn(Command);
WriteLn(Command);
if (Command = '/q') then
Running := false;
end;
SetConsoleOutputCP(CurrentCodePage);
SetTextCodePage(Output, CurrentCodePage);
end.
在上面的示例中,在我运行应用程序之后,如果我输入以下文本:
'Olámundo。'
WriteLn将显示:
'Ol mundo。'
在第一遍之后,ReadLn命令读取的所有UTF-8字符都显示正常。 这段代码有问题吗?我试图在网上搜索更多细节,但我没有找到任何与此相关的信息。 调用“WriteLn(MyText);”在代码的开头,显示文本'Olámbndo'。正确。
答案 0 :(得分:0)
好的,在更多地关注Arioch的第一条评论之后,我尝试了下面的代码,它可以在任何控制台上完美运行。
program ConsTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Classes,
WinApi.Windows;
var
Command: String;
Running: Boolean;
MyText: String;
begin
MyText := 'Olá mundo.';
WriteLn(MyText);
Reset(Input); //*** That's the catch. ***
Running := True;
while Running do
begin
ReadLn(Input, Command);
if (MyText = Command) then
WriteLn('Yes')
else
WriteLn('No');
WriteLn(Command);
if (Command = '/q') then
Running := false;
end;
end.
* OBS:上面的代码对某些字母表不起作用,我需要更好地了解Unicode和Delphi中的控制台模式。 由于某些巧合,它解决了我的问题但不能被视为实际的答案。无论如何,为了确保第一次调用ReadLn能够正常工作,似乎需要调用函数“Reset(Input)”。