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

时间:2010-05-18 11:31:39

标签: delphi unicode console delphi-5

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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中每个字节的单个字符)然后键入将其转换为字符串,这是D5中的AnsiString。

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

答案 2 :(得分:-1)

我已经改变了一些事情如下并且工作正常:
在控制台应用程序中,我没有使用SetConsoleOutputCP(CP_UTF8)。只使用字符串输出...
在另一个程序(Delphi 5)中,我使用this函数而不使用 OemToChar(缓冲区,缓冲区)