我有控制台应用程序。用 Delphi 2010 编写。它的输出支持 Unicode。(我为此使用了 UTF8Encode 和 SetConsoleOutputCP(CP_UTF8))。当我从命令提示符运行程序时,它工作正常。
现在我想读取在Delphi 5中创建的另一个程序的输出。我使用这种方法。但是我遇到了 unicode 字符的问题。
有没有人推荐阅读控制台应用程序的 unicode 输出。从德尔福5?
3 回答
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
使用带有 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。
我进行了如下更改,它工作正常:
在控制台应用程序中,我没有使用 SetConsoleOutputCP(CP_UTF8)。仅使用字符串输出...
而在其他程序(Delphi 5)中,我使用此功能而不使用OemToChar(Buffer,Buffer)