1

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

4

3 回答 3

1

Delphi 5 确实支持 unicode,但只能通过 UTF-16(-LE) 编码的 WideStrings。D5 本身不支持 UTF-8。

您可以按照您已经做的方式读取 D2010 控制台应用程序的输出,尽管我会取出 OemToAnsi 转换。OEMToAnsi 被 OEMToChar 取代(即使在 D5 天),它可用于将 OEM 字符转换为 Ansi(使用各种代码页的单字节字符)或 WideString(UTF-16-LE Unicode),但它不会做任何事情解释传入的 UTF-8 字节,可能只会把事情搞砸。

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

一个可以转换许多不同编码并且仍然支持 D5 的库是 DIUnicode: http: //www.wikitaxi.org/delphi/doku.php/products/unicode/index

于 2010-05-18T19:03:59.773 回答
0

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

首先是 TMemo 不支持 Unicode 字符,您需要找到另一个控件,例如TMS Unicode Component Pack中的控件。但是,此组件包不支持 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) ;

它正在读取他的字符并将它们放入缓冲区,这是一个 PCHAR(D5 中每个字节一个字符)然后将其类型转换为一个 String,它是 D5 中的 AnsiString。

虽然我已经很多年没用过 D5,但我记得唯一能在 D5 中处理 unicode 数据的类型是 WideString。

于 2010-05-18T15:29:37.030 回答
-1

我进行了如下更改,它工作正常:
在控制台应用程序中,我没有使用 SetConsoleOutputCP(CP_UTF8)。仅使用字符串输出...
而在其他程序(Delphi 5)中,我使用功能而不使用OemToChar(Buffer,Buffer)

于 2010-07-13T06:59:35.940 回答