читать вывод Unicode консольного приложения - PullRequest
1 голос
/ 18 мая 2010

У меня консольное приложение. написано в Delphi 2010. Его вывод поддерживается Unicode. (Я использовал для этого UTF8Encode и SetConsoleOutputCP (CP_UTF8)). Когда я запускаю программу из командной строки, она работает нормально.
Теперь я хочу прочитать вывод из другой программы, созданной в Delphi 5 . Я использую этот метод. Но у меня проблемы с символами Юникода.
У кого-нибудь есть рекомендации по чтению вывода Unicode консольного приложения. от Delphi 5?

Ответы [ 3 ]

1 голос
/ 18 мая 2010

Delphi 5 поддерживает Unicode, но только через WideStrings, которые закодированы в UTF-16 (-LE). Собственно, у D5 нет поддержки UTF-8.

Вы можете прочитать вывод вашего консольного приложения D2010 так, как вы уже это делаете, хотя я бы исключил преобразование OemToAnsi. OEMToAnsi был заменен (даже в течение 5 дней) OEMToChar, который можно использовать для преобразования 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

0 голосов
/ 13 июля 2010

Я кое-что изменил следующим образом, и он отлично работает:
В консольном приложении я не использовал SetConsoleOutputCP (CP_UTF8). Использовать только строковый вывод ...
А в другой программе (Delphi 5) я использую эту функцию без использования OemToChar (Buffer, Buffer)

0 голосов
/ 18 мая 2010

У вас две проблемы с использованием 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). Затем введите приведение к String, которая является строкой AnsiString в D5.

Хотя я не использовал D5 в течение многих лет, единственный тип, который я помню, который может обрабатывать данные Unicode в D5, - это WideString.

...