Programación General > Pascal
No entiendo UTF8 en consola Windows
(1/1)
aguila3000:
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 ---{código de página UTF8}//sin firma Unicode BOMBegin Writeln('code page UTF8 - 65001 en Windows'); Writeln('camión')End.
Compilo el programa, y después lo ejecuto y aparece el siguiente error :
--- Código: Text ---Runtime error 101 at $00401460 $00401460 $004069B1
El mismo programa, cuando lo compilo y lo ejecuto en linux. funciona bien.
¿ Qué estoy haciendo mal ?
¿ Cómo puedo correguir ese problema ?
DriverOp:
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:
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:
No lo sabía.
Lo lamento, no sé cuál es el problema.
aguila3000:
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 --- Uses Windows;Var Arch:Word; BB:longWord; cad:string;Begin Arch:=GetStdHandle(STD_OUTPUT_HANDLE); //Se obtiene manejador cad:='camión'+#$0D+#$0A; //Se añade Saltos de línea WriteFile(Arch,cad[1],length(cad),BB,nil); Writeln('BB = ',BB)End.
usando clases TStream tambien sería de este modo :
--- Código: Delphi --- uses classes,windows;var s: string; OutputStream: TStream;Begin OutputStream := THandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE)); s:='camión'; OutputStream.write(s[1],Length(s)); OutputStream.free; End.
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.
Navegación
Ir a la versión completa