• Domingo 22 de Diciembre de 2024, 16:24

Autor Tema:  No entiendo UTF8 en consola Windows  (Leído 3052 veces)

aguila3000

  • Miembro activo
  • **
  • Mensajes: 26
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.conoce3000.com
No entiendo UTF8 en consola Windows
« en: Miércoles 17 de Febrero de 2010, 20:56 »
0
No entiendo UTF8 en consola Windows
Yo escribí el siguiente programa, usando un editor UTF8, sin marca de BOM. Usando el comando chcp, cambio el código de página a 65001, el UTF8 para
Windows.

Código: Pascal
  1. {código de página UTF8}
  2. //sin firma Unicode BOM
  3. Begin
  4.  Writeln('code page UTF8 - 65001 en Windows');
  5.  Writeln('camión')
  6. End.
  7.  

Compilo el programa, y después lo ejecuto y aparece el siguiente error :

Código: Text
  1. Runtime error 101 at $00401460
  2.    $00401460
  3.    $004069B1
  4.  

El mismo programa, cuando lo compilo y lo ejecuto en linux. funciona bien.
¿ Qué estoy haciendo mal ?
¿ Cómo puedo correguir ese problema ?

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: No entiendo UTF8 en consola Windows
« Respuesta #1 en: Jueves 18 de Febrero de 2010, 00:23 »
0
Pero la consola de Windows no soporta UTF-8, es exclusivamente ANSI. Igual no entiendo bien lo que quieres hacer y el mensaje de error significa que fue imposible escribir en un archivo (lo cual tiene sentido porque para Pascal, la pantalla es un archivo de texto).

aguila3000

  • Miembro activo
  • **
  • Mensajes: 26
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.conoce3000.com
Re: No entiendo UTF8 en consola Windows
« Respuesta #2 en: Jueves 18 de Febrero de 2010, 00:46 »
0
Si soporta UTF8, debes cambiar las fuentes a lucida, y después en la consola ejecutas el siguiente comando chcp 65001, que seria el UTF8 en la consola de Windows.
No se si windowsXP lo soporta.

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: No entiendo UTF8 en consola Windows
« Respuesta #3 en: Jueves 18 de Febrero de 2010, 04:13 »
0
No lo sabía.

Lo lamento, no sé cuál es el problema.

aguila3000

  • Miembro activo
  • **
  • Mensajes: 26
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.conoce3000.com
Re: No entiendo UTF8 en consola Windows
« Respuesta #4 en: Jueves 18 de Marzo de 2010, 23:38 »
0
Bueno por fin entendí, cual es el problema.
Sucede que la rutina Writeln o Write, hace uso de la función WriteFile de la api de windows.
Esta función tiene un parametro lpNumberOfBytesWritten, que devuelve los bytes enviados a consola o un archivo que se escribieron satisfactoriamente.
Freepascal hace uso de ese parametro comprobando el valor devuelto, si este devuelve un valor igual a cero significa que algo estuvo mal.
La funcion Writefile tiene un fallo, sucede que cuando se usa en consola con Unicode(65001), no devuelve los bytes escritos en consola pero los escribe y eso hace que salte el error en pascal.
La solución es usar directamente esta función de la api de windows, si es que sólo quieren escribir o enviar salidas a consola en unicode (utf8), sólo en Windows.
Nota: esto es asi, si el código fuente se escribe en utf8.

Código: Pascal
  1.  
  2. Uses Windows;
  3. Var Arch:Word;
  4.     BB:longWord;
  5.     cad:string;
  6. Begin
  7.    Arch:=GetStdHandle(STD_OUTPUT_HANDLE); //Se obtiene manejador
  8.    cad:='camión'+#$0D+#$0A;  //Se añade Saltos de línea
  9.    WriteFile(Arch,cad[1],length(cad),BB,nil);
  10.    Writeln('BB = ',BB)
  11. End.
  12.  
  13.  

usando clases TStream tambien sería de este modo :

Código: Delphi
  1.  
  2. uses classes,windows;
  3. var  s: string;
  4.       OutputStream: TStream;
  5. Begin
  6.      OutputStream := THandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE));
  7.      s:='camión';
  8.      OutputStream.write(s[1],Length(s)); 
  9.      OutputStream.free; 
  10. End.
  11.  
  12.  

No se realmente si sea la solución perfecta o idonea, pero si a alguien se le ocurre algo mejor. La ayuda no vendría mal.