Как я могу создать консольное приложение Unicode с помощью Delphi 2009?
Если мне это нравится:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
writeln('öüğşç سيمانتت');
end.
Получаю следующее:
ougsc ???????
Как я могу создать консольное приложение Unicode с помощью Delphi 2009?
Если мне это нравится:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
writeln('öüğşç سيمانتت');
end.
Получаю следующее:
ougsc ???????
Я не уверен, что это именно то, что вам нужно, но вы можете создавать консольные приложения 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 в редакторе ...
Writeln в Delphi 2009 по-прежнему использует ANSI (см. System TTextRec), но вы можете использовать UTF8Encode и изменить кодовую страницу вывода консоли на UTF8, вызвав SetConsoleOutputCP (CP_UTF8). Вам также понадобится хороший шрифт для отображения символов Юникода.
Вы не можете (по крайней мере, не со стандартной библиотекой). Консольные функции - единственные не Unicode функции в Delphi 2009.
@Kabrol: С установленным растровым шрифтом я не вижу ни одного символа, но с Lucida Console я вижу как минимум widechar ($ 11f) - «ğ».
См. «SetConsoleOutputCP только для шрифтов Unicode» и общее описание функций консольного API на «Справочник по консоли».
Консоль Windows не может отображать символы Unicode, поэтому попробуйте отправить вывод в файл с помощью:
my_app.exe > unicode_file.txt
и попробуйте просмотреть unicode_file.txt в хорошем текстовом редакторе.
На самом деле есть способ сделать это с помощью стандартных вызовов WriteLn (), но он включает исправление ошибки в Delphi 2009 RTL. Дело в том, что Delphi творит чудеса компилятора для WriteLn. Для аргументов UnicodeString это приводит к вызову _WriteUString. Этот метод можно увидеть в System.pas, хотя вы не можете вызвать его напрямую. В нем вы увидите вызов _WriteLString, но этот метод получает аргумент AnsiString. Итак, когда происходит этот вызов, ваш UnicodeString понижается до AnsiString.
Решение состоит в том, чтобы изменить приведение UnicodeString-> AnsiString в приведение UnicodeString-> UTF8String.
Теперь, когда вы устанавливаете консоль в UTF8, все ваши символы останутся нетронутыми (и да, конечно, вам понадобится шрифт с поддержкой символов, которые вы хотите показать):
SetConsoleOutputCP(CP_UTF8)
Для этого исправления RTL вам нужно будет произвести некоторую изящную привязку кода. Я уже сделал это, и мой коллега занят написанием статьи об этом. Я отправлю ссылку, как только она станет доступна в Интернете.
Ваше здоровье!