XE7 ReadLn命令中的UTF8文本问题

时间:2015-06-08 12:25:24

标签: delphi utf-8 console console-application windows-console

当我试图在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'。正确。

1 个答案:

答案 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)”。