En realidad, hay una forma de hacer esto con las llamadas estándar WriteLn(), pero implica reparar un error en la RTL Delphi 2009. El caso es que Delphi hace magia de compilación para WriteLn. Para los argumentos de UnicodeString, esto da como resultado una llamada a _WriteUString. Ese método se puede ver en System.pas, aunque no puede llamarlo directamente. En él, verá una llamada a _WriteLString, pero ese método recibe un argumento de AnsiString. Entonces, cuando se realiza esta llamada, su UnicodeString se descuenta a AnsiString.
La solución es cambiar esta conversión UnicodeString-> AnsiString en un molde UnicodeString-> UTF8String.
Ahora, cuando se establece la consola a UTF8, todos tus personajes atravesarán sin tocar (y sí, por supuesto que va a necesitar una fuente con soporte para los caracteres que desea mostrar):
SetConsoleOutputCP(CP_UTF8)
Para este arreglo RTL, necesitarás hacer algunos ingeniosos enganches de código. Ya he hecho esto, y un colega mío está ocupado escribiendo un artículo sobre esto. Publicaré un enlace una vez que esté disponible en línea.
¡Salud!
Probé tu código. No funciona ¿Lo ha probado para caracteres Unicode no ANSI (por ejemplo, widechar ($ 416) - "Ж", widechar ($ 11f) - "ğ", widechar ($ 633) - "س")? –
Lo siento, me olvidé de la fuente de consola (la ejecuté en modo de depuración). Gracias, funciona con la fuente vectorial (cambié la fuente del vector de la consola a "Courier New"). –
WriteConsole no funcionará para la salida redirigida (como app.exe> file.txt), por lo que es mejor comprobar si WriteConsole devuelve False y luego usar WriteFile. Con WriteFile puede escribir unicode o ansi. La mayoría de las aplicaciones usuales usan ansi en ese caso. – Alex