Настройка функции Writeln в Delphi для корректного вывода Unicode-символов
Вопрос, который часто возникает среди разработчиков на Delphi, касается возможности вывода Unicode-символов с помощью стандартной функции Writeln. По умолчанию Writeln не поддерживает Unicode, что может привести к отображению непонятных символов в консоли. Однако, существуют способы убедить Writeln корректно обрабатывать Unicode-символы.
Пример проблемы
Рассмотрим пример программы на Delphi:
{$APPTYPE CONSOLE}
begin
Writeln('АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ');
end.
Вывод в консоли, использующей шрифт Consolas, будет следующим:
????????Z??????????????????????????????????????
В то время как функция WriteConsole из модуля Winapi.Windows успешно выводит Unicode-символы:
{$APPTYPE CONSOLE}
uses
Winapi.Windows;
const
Text = 'АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ';
var
NumWritten: DWORD;
begin
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(Text), Length(Text), NumWritten, nil);
end.
Вывод в этом случае будет корректным:
АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ
Решение проблемы
Чтобы убедить Writeln корректно обрабатывать Unicode, можно использовать функцию SetConsoleOutputCP, которая устанавливает кодовую страницу вывода в консоль:
program Project1;
{$APPTYPE CONSOLE}
uses
System.SysUtils,Windows;
const
Text = 'АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ';
var
NumWritten: DWORD;
begin
ReadLn; // Убедимся, что шрифт Consolas выбран
try
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(Text), Length(Text), NumWritten, nil);
SetConsoleOutputCP(CP_UTF8);
Writeln('АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.
После выполнения данной программы в консоли будет отображаться текст на кириллице.
Альтернативные подходы
Существуют и другие способы настройки вывода Unicode-символов. Например, использование функции WriteConsoleW, которая поддерживает UTF-16, или настройка процедуры AlternateWriteUnicodeStringProc для кастомизации поведения Writeln.
Заключение
Для корректного вывода Unicode-символов в консоль из программы на Delphi, можно использовать функцию SetConsoleOutputCP с кодовой страницей CP_UTF8. Это позволит Writeln корректно отображать символы в консоли, использующей шрифт, поддерживающий Unicode.
Настройка функции `Writeln` в Delphi для корректного вывода Unicode-символов требует использования функции `SetConsoleOutputCP` с кодовой страницей `CP_UTF8`, чтобы обеспечить правильное отображение символов в консоли.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.