代码之家  ›  专栏  ›  技术社区  ›  SimaWB

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

  •  1
  • SimaWB  · 技术社区  · 14 年前

    我有控制台应用程序。用Delphi2010写的。它的输出支持Unicode。(我使用了utf8encode和setconsoleoutputcp(cp_utf8)。当我从命令提示符运行程序时,它工作正常。
    现在,我想从另一个在 德尔福5 . 我用 this 方法。但Unicode字符有问题。
    是否有人建议阅读控制台应用程序的Unicode输出?从德尔福5?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Marjan Venema    14 年前

    Delphi5确实支持Unicode,但只能通过UTF-16(-le)编码的宽字符串。在本地,d5不支持utf-8。

    您可以像以前那样读取d2010控制台应用程序的输出,尽管我将取出oemtoansi转换。oem to ansi被oemtochar(甚至在d5天内)所取代,oemtochar可用于将oem字符转换为ansi(使用各种代码页的单字节字符)或widestring(utf-16-le unicode),但它不会做任何事情来解释传入的utf-8字节,可能会把事情搞得一团糟。

    您需要的是一组函数,这些函数可以获取您从管道中读取的所有“原始”UTF-8字节,并将它们转换为(UTF-16-LE编码)宽字符串,然后您可以将其馈送给可以接收和显示宽字符串的控件。或者,您可以寻找一个完全执行“原始”字节解释和转换的控件,但我必须承认,我没有看到任何更不用说仍然支持d5的控件。

    可以转换许多不同编码但仍支持d5的库是diunicode: http://www.wikitaxi.org/delphi/doku.php/products/unicode/index

        2
  •  0
  •   Robert Love    14 年前

    使用带有Unicode输出的Delphi5有两个问题。

    第一个是tmemo不支持Unicode字符,您需要找到另一个控件,例如 TMS Unicode Component Pack . 但是,这个组件包不支持Delphi5。

    第二个问题是代码的这一部分:

      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中每字节一个字符),然后键入casting,将其转换为字符串,该字符串在d5中为ansistry。

    虽然我已经多年没有使用d5了,但我能记住的唯一能在d5中处理Unicode数据的类型是wideString。

        3
  •  -1
  •   SimaWB    14 年前

    我已经改变了一些事情,如下所示,它工作得很好:
    在控制台应用程序中,我没有使用setconsoleoutputcp(cp_utf8)。仅使用字符串输出…
    在另一个程序(Delphi5)中,我使用 this 不使用功能 Oemtochar(缓冲器、缓冲器)