Консольное приложение Unicode в Delphi 2009 - PullRequest
10 голосов
/ 05 ноября 2008

Как я могу создать консольное приложение Unicode с Delphi 2009?

Если я так и сделаю:

{$APPTYPE CONSOLE}
uses
  SysUtils;
begin
  writeln('öüğşç سيمانتت');
end.

Я получаю следующее:

ougsc ???????

Ответы [ 6 ]

11 голосов
/ 06 ноября 2008

Writeln в Delphi 2009 по-прежнему использует ANSI (см. System TTextRec), но вы можете использовать UTF8Encode и изменить кодовую страницу вывода консоли на UTF8, вызвав SetConsoleOutputCP (CP_UTF8). Вам также понадобится хороший шрифт для отображения символов Юникода.

9 голосов
/ 05 ноября 2008

Я не уверен, что это то, что вам нужно, но вы можете создавать консольные приложения Unicode во всех 32-битных версиях Delphi, используя функции Windows API. Я только что попробовал с Delphi 4:

program test;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  s: WideString;
  i: integer;
  Written: Cardinal;
begin
  SetLength(s, 80);
  for i := 1 to 80 do
    s[i] := WideChar(48 + i);
  WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), PWideChar(s), 80, Written,
    nil);
end.

У меня нет Delphi 2009, чтобы попробовать, как работает ввод строк Unicode в редакторе ...

5 голосов
/ 05 ноября 2008

Вы не можете (по крайней мере, не со стандартной библиотекой). Консольные функции - единственные функции не в Юникоде в Delphi 2009.

1 голос
/ 06 ноября 2008

@ Kabrol: С установленным растровым шрифтом я не вижу ни одного из символов, но с Lucida Console я вижу по крайней мере widechar ($ 11f) - "ğ".

См. "SetConsoleOutputCP Действует только со шрифтами Unicode" и в целом описание функций API консоли в "Справочник консоли" .

0 голосов
/ 10 ноября 2008

На самом деле, есть способ сделать это стандартными вызовами WriteLn (), но это включает исправление ошибки в RTL Delphi 2009. Дело в том, что Delphi использует магию компилятора для WriteLn. Для аргументов UnicodeString это приводит к вызову _WriteUString. Этот метод можно увидеть в System.pas, хотя вы не можете вызвать его напрямую. В нем вы увидите вызов _WriteLString, но этот метод получает аргумент AnsiString. Поэтому, когда происходит этот вызов, ваша UnicodeString понижается до AnsiString.

Решение состоит в том, чтобы изменить это приведение UnicodeString-> AnsiString в приведение UnicodeString-> UTF8String.

Теперь, когда вы установите консоль в UTF8, все ваши персонажи пройдут без изменений (и, конечно же, вам понадобится шрифт с поддержкой символов, которые вы хотите показать):

SetConsoleOutputCP(CP_UTF8)

Для этого исправления RTL вам понадобится изящная перехват кода. Я уже сделал это, и мой коллега занят написанием статьи об этом. Я опубликую ссылку, как только она будет доступна онлайн.

Ура!

0 голосов
/ 05 ноября 2008

Консоль Windows не может отображать символы Юникода, поэтому попробуйте отправить вывод в файл с:

my_app.exe > unicode_file.txt

и попробуйте просмотреть unicode_file.txt в хорошем текстовом редакторе.

...