На самом деле, есть способ сделать это стандартными вызовами WriteLn (), но это включает исправление ошибки в RTL Delphi 2009.
Дело в том, что Delphi использует магию компилятора для WriteLn. Для аргументов UnicodeString это приводит к вызову _WriteUString. Этот метод можно увидеть в System.pas, хотя вы не можете вызвать его напрямую. В нем вы увидите вызов _WriteLString, но этот метод получает аргумент AnsiString. Поэтому, когда происходит этот вызов, ваша UnicodeString понижается до AnsiString.
Решение состоит в том, чтобы изменить это приведение UnicodeString-> AnsiString в приведение UnicodeString-> UTF8String.
Теперь, когда вы установите консоль в UTF8, все ваши персонажи пройдут без изменений (и, конечно же, вам понадобится шрифт с поддержкой символов, которые вы хотите показать):
SetConsoleOutputCP(CP_UTF8)
Для этого исправления RTL вам понадобится изящная перехват кода. Я уже сделал это, и мой коллега занят написанием статьи об этом. Я опубликую ссылку, как только она будет доступна онлайн.
Ура!