2010-05-18 101 views
1

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

+0

在这个问题似乎有一个缓冲:PChar类型应该是缓冲区:pansichar。其余的,我不明白具体的问题是什么,你能详细说明你有什么吗? – 2010-05-18 13:05:54

回答

-1

我已经改变了出头如下工作得很好:
在控制台应用程序,我没有使用SetConsoleOutputCP(CP_UTF8 )。仅使用字符串输出...
,并在其他程序(Delphi 5中),我用不使用OemToChar(缓冲区,缓冲区)this功能

+0

-1,该问题询问如何使用D5读取unicode数据。这个答案根本不涉及unicode。 – 2010-07-13 08:52:02

0

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

第一个是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中的每个字节)然后键入将其转换为D5中的AnsiString字符串。

尽管多年来我没有使用过D5,但我能记住的唯一可以处理D5中的unicode数据的类型是WideString。

+0

我仍然使用D5开启和关闭。它确实有WideString/Unicode支持。但是,WideStrings是UTF-16编码,UTF-16-LE更精确。在D5中没有找到任何原生UTF-8支持。搜索D5帮助不会产生任何东西,也不会搜索D5源。 – 2010-05-18 18:10:00

+0

@Marjan:UTF-16-LE转换为UTF-8,反之亦然,即使它不是D5 RTL的一部分也不是什么大问题。例如,dxgettext源具有与D5一起使用的UTF-8例程。 – mghie 2010-05-18 20:20:32

1

德尔福5确实有unicode支持,但只能通过UTF-16(-LE)编码的WideStrings。本质上,D5没有UTF-8支持。

虽然我会取出OemToAnsi转换,但您可以按照您已经做的方式读取D2010控制台应用程序的输出。 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

相关问题