2010-05-18 5 views
1

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

+0

В этом вопросе есть только кажется, буфер: PChar, который должен быть буфер: pansichar. В остальном я не понимаю, в чем проблема, не могли бы вы подробнее рассказать о том, что у вас есть? –

ответ

-1

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

+0

-1, Вопрос задает вопрос о том, как читать данные Unicode с помощью D5. Этот ответ вовсе не связан с unicode. –

0

У вас есть две проблемы с использованием Delphi 5 с выходом unicode.

Первое, что TMemo не поддерживает символы Юникода, вам нужно будет найти другой элемент управления, например, в 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) Затем введите листинг этой строки в строку, которая является AnsiString в D5.

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

+0

Я все еще работаю с D5 вкл./Выкл. Он действительно поддерживает WideString/Unicode. Тем не менее, WideStrings кодируются UTF-16, UTF-16-LE - более точно. Не нашли родной поддержки UTF-8 в D5. Поиск справки D5 ничего не вызывает и не ведет поиск источников D5. –

+0

@Marjan: конвертация UTF-16-LE в UTF-8 и наоборот - не проблема, даже если она не является частью D5 RTL.Источники dxgettext, например, имеют подпрограммы UTF-8, работающие с D5. – mghie

1

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

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

Смежные вопросы