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