2008-11-05 22 views

Respuesta

9

No estoy seguro de que eso es lo que está buscando, 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 intentar 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 tratar la forma de entrar en las cadenas Unicode en el editor de obras ...

+0

Probé tu código. No funciona ¿Lo ha probado para caracteres Unicode no ANSI (por ejemplo, widechar ($ 416) - "Ж", widechar ($ 11f) - "ğ", widechar ($ 633) - "س")? –

+0

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"). –

+1

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

5

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

+0

Si Delphi 2009 realmente es full-unicode, debe haber una forma de hacerlo. –

+0

No, la consola es la única parte no unicode. Tengo esa información directamente de un orador de codegear en una conferencia. –

+0

Gracias por esta información. –

0

consola de Windows no puede mostrar charactes Unicode, así que intenta enviar la salida a presentar con:

my_app.exe > unicode_file.txt 

y tratar de ver unicode_file.txt con buen texto editor.

+0

Consola de ventana puede mostrar caracteres Unicode. Hay varios programas que usan consola Unicode. Redirigir el resultado a un archivo da el mismo texto ansi dañado. –

1

@Kabrol: Con el conjunto de fuente de trama no lo hago vea cualquiera de los caracteres, pero con Lucida Console veo al menos widechar ($ 11f) - "ğ".

Consulte "SetConsoleOutputCP Only Effective with Unicode Fonts" y, en general, la descripción de las funciones de la API de consola en "Console Reference".

+0

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"). –

10

Writeln en Delphi 2009 todavía usa ANSI (ver Sistema 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.

+0

¡Increíble! Gracias, funciona No sabía que la consola de Windows admite un juego de caracteres multibyte como UTF-8. –

0

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!

+0

Esto suena a reinventar la rueda ya que ya hay un artículo que dice "Homer's Odyssey": http://edn.embarcadero.com/article/39022 – mjn

+0

Quizás no te diste cuenta, pero este es exactamente el artículo que quería decir - el que escribió mi colega Marjan Venema (si miras de cerca, mi nombre _fuera_ aparece algunas veces). De todos modos, gracias por agregar el enlace - A veces olvido esas cosas. Y sí, ¡más bien parece una odisea! – PatrickvL

Cuestiones relacionadas