delphi unicode console delphi-2009

Aplicación de consola Unicode en Delphi 2009



console delphi-2009 (6)

La consola de Windows no puede mostrar caracteres unicode, por lo que intenta enviar el resultado al archivo con:

my_app.exe > unicode_file.txt

e intente ver unicode_file.txt con un buen editor de texto.

¿Cómo puedo crear una aplicación de consola Unicode con Delphi 2009?

Si me gusta esto:

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

Obtengo lo siguiente:

ougsc ???????


No estoy seguro de que sea eso lo que busca, pero puede crear aplicaciones de consola Unicode en todas las versiones de Delphi de 32 bits utilizando las funciones de la API de Windows. Acabo de probar con 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.

No tengo Delphi 2009 para probar cómo funciona el ingreso de cadenas Unicode en el editor ...


No se puede (al menos no con la biblioteca estándar). Las funciones de consola son las únicas funciones no Unicode en Delphi 2009.



Writeln en Delphi 2009 todavía usa ANSI (vea System TTextRec) pero puede usar UTF8Encode y cambiar la página de códigos de salida de la consola a UTF8 llamando a SetConsoleOutputCP (CP_UTF8). También necesitará una buena fuente para mostrar realmente los caracteres Unicode.


En realidad, hay una manera de hacerlo con las llamadas estándar WriteLn (), pero implica reparar un error en Delphi 2009 RTL. 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 configure la consola en UTF8, todos sus caracteres pasarán intactos (y sí, por supuesto, necesitará una fuente con soporte para los caracteres que quiera 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.

¡Aclamaciones!