簡體   English   中英

讀取控制台應用程序的unicode輸出

[英]read unicode output of console application

我有控制台應用程序。 用Delphi 2010編寫。其輸出支持Unicode。 (為此,我使用了UTF8Encode和SetConsoleOutputCP(CP_UTF8))。 當我從命令提示符運行程序時,它可以正常工作。
現在,我想讀取在Delphi 5中創建的另一個程序的輸出。 我用這種方法。 但是我遇到了Unicode字符的問題。
是否有人建議閱讀控制台應用程序的unicode輸出。 來自Delphi 5?

Delphi 5確實支持unicode,但只能通過UTF-16(-LE)編碼的WideString來實現。 D5本身不具有UTF-8支持。

盡管我會進行OemToAnsi轉換,但是您可以按照已經做過的方式閱讀D2010控制台應用程序的輸出。 OEMToChar取代了OEMToAnsi(甚至在D5天之內),OEMToAnsi可用於將OEM字符轉換為Ansi(使用各種代碼頁的單字節字符)或WideString(UTF-16-LE Unicode),但它不會做任何事情解釋進來的UTF-8字節,可能會使事情搞砸。

您需要的是一組函數,這些函數可以獲取從管道中讀取的所有“原始” utf-8字節,並將它們轉換為(UTF-16-LE編碼)WideString,然后可以將其饋送到可以使用的控件中。在並顯示WideStrings。 或者,您可以尋找一種控件,該控件本身可以進行“原始”字節解釋和轉換,但是我必須承認,我還沒有看到任何仍然支持D5的控件。

可以轉換許多不同編碼並且仍然支持D5的庫是DIUnicode: http//www.wikitaxi.org/delphi/doku.php/products/unicode/index

將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。

我已經進行了如下更改,並且效果很好:
在控制台應用程序中,我沒有使用SetConsoleOutputCP(CP_UTF8)。 僅使用字符串輸出...
在其他程序(Delphi 5)上,我不使用OemToChar(Buffer,Buffer)就使用了功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM