Delphi 读取控制台应用程序的unicode输出

Delphi 读取控制台应用程序的unicode输出,delphi,unicode,console,delphi-5,Delphi,Unicode,Console,Delphi 5,我有一个控制台应用程序。用Delphi 2010编写。它的输出支持Unicode。(我为此使用了UTF8Encode和SetConsoleOutputCP(CP_UTF8))。当我在命令提示符下运行程序时,它工作正常。 现在我想读取另一个程序的输出,该程序是在Delphi 5中创建的。我使用这种方法。但是我在unicode字符方面有问题。 是否有人建议阅读console应用程序的unicode输出。从Delphi 5?使用带有unicode输出的Delphi 5有两个问题 首先,TMemo不支持

我有一个控制台应用程序。用Delphi 2010编写。它的输出支持Unicode。(我为此使用了UTF8Encode和SetConsoleOutputCP(CP_UTF8))。当我在命令提示符下运行程序时,它工作正常。
现在我想读取另一个程序的输出,该程序是在Delphi 5中创建的。我使用这种方法。但是我在unicode字符方面有问题。

是否有人建议阅读console应用程序的unicode输出。从Delphi 5?

使用带有unicode输出的Delphi 5有两个问题

首先,TMemo不支持Unicode字符,您需要找到另一个控件,如中的控件。但是,此组件包不支持Delphi 5

第二个问题是代码的这一部分:

  repeat
    BytesRead := 0;
    ReadFile(ReadPipe,Buffer[0],
    ReadBuffer,BytesRead,nil) ;
    Buffer[BytesRead]:= #0;
    OemToAnsi(Buffer,Buffer) ;
    AMemo.Text := AMemo.text + String(Buffer) ;
  until (BytesRead < ReadBuffer) ;
重复
字节读取:=0;
ReadFile(ReadPipe,缓冲区[0],
读取缓冲区,字节读取,无);
缓冲区[字节读取]:=#0;
OemToAnsi(缓冲区,缓冲区);
AMemo.Text:=AMemo.Text+字符串(缓冲区);
直到(字节读取<读取缓冲区);
它读取字符并将它们放入缓冲区,缓冲区是一个PCHAR(D5中每个字节一个字符),然后将其转换为一个字符串,该字符串是D5中的一个AnsiString


虽然我已经多年没有使用D5了,但我记得在D5中可以处理unicode数据的唯一类型是WideString

Delphi 5确实支持unicode,但仅通过UTF-16(-LE)编码的宽字符串。就本机而言,D5不支持UTF-8

你可以像以前一样读取D2010控制台应用程序的输出,尽管我会进行OemToAnsi转换。OEMToAnsi被OEMToChar取代(即使在D5天内),OEMToChar可用于将OEM字符转换为Ansi(使用各种代码页的单字节字符)或WideString(UTF-16-LE Unicode),但它无法解释传入的UTF-8字节,可能会把事情搞砸

您需要的是一组函数,这些函数可以获取从管道中读取的所有“原始”utf-8字节,并将它们转换为(utf-16-LE编码的)宽字符串,然后将其馈送到可以接收和显示宽字符串的控件。或者,您可以寻找一个完全自己执行“原始”字节解释和转换的控件,但我必须承认,我还没有看到任何仍然支持D5的控件,更不用说了


DIUnicode是一个可以转换多种不同编码并仍然支持D5的库:

我做了如下更改,效果很好:
在控制台应用程序中,我没有使用SetConsoleOutputCP(CP_UTF8)。仅使用字符串输出…

在另一个程序(Delphi 5)中,我使用函数而不使用OemToChar(Buffer,Buffer)

在这个问题中,似乎有一个Buffer:pchar应该是Buffer:pansichar。对于其余的,我不明白确切的问题是什么,你能更详细地说明你有什么吗?我仍然与D5的工作和关闭。它确实支持WideString/Unicode。然而,宽字符串是UTF-16编码的,更准确地说是UTF-16-LE。在D5中未找到任何本机UTF-8支持。搜索D5帮助不会显示任何内容,也不会搜索D5源。@Marjan:UTF-16-LE到UTF-8的转换,反之亦然,即使它不是D5 RTL的一部分。例如,dxgettext源代码有UTF-8例程与D5一起工作。问题是如何使用D5读取unicode数据。这个答案根本不涉及unicode。