Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer lineas de consola de comandos (https://www.clubdelphi.com/foros/showthread.php?t=97450)

victor03 07-05-2025 15:00:59

Leer lineas de consola de comandos
 
hola, tengo un programa que hice de consola el cual me devuelve unas líneas de comando que después yo leo y manejo según lo que me pongan, el porblema que yo tengo es a la hora de leer esas lineas,
y es que si hay un caracter especial 'ñ','á'... esa palabra me la deja en blanco, por lo que he visto el problema esta en 'OutputLine := WideString(Buffer) ; ' he probado a cambiar el wideString por string UTF8Encode... y no me han funcionado.

Código Delphi [-]
  RutaEXE := 'C:\SII\envioVerifactu\envioVerifactu.exe';
  Parametros := '"' + fichero + '" ' + CONTROLWCERT_HUELLA.AsString + ' "' + CONTROLWRUTA_VERIFACTU.AsString + '"';
  CommandLine := '"' + RutaEXE + '" ' + Parametros;

  LOG('EJECUTANDO: ' + CommandLine);

  try
    if CreateProcess(nil, PChar(CommandLine),
      nil, nil, True, 0, nil, nil, StartupInfo, ProcessInfo) then
    begin
        CloseHandle(WritePipe); // Solo lecturaG

        LOG('LEER LA SALIDA DEL PROCESO');
        repeat
          BytesRead := 0;
          ZeroMemory(@Buffer, SizeOf(Buffer));
          if ReadFile(ReadPipe, Buffer, SizeOf(Buffer) - 1, BytesRead, nil) and (BytesRead > 0) then
          begin
            Buffer[BytesRead] := #0;
            OutputLine := WideString(Buffer) ;     
            ConsolaSalida := ConsolaSalida + OutputLine;
            LOG(CONSOLAsALIDA);
          end;
        until BytesRead = 0;

Neftali [Germán.Estévez] 07-05-2025 16:15:15

¿Con qué versión de Delphi estás trabajando?

victor03 08-05-2025 12:54:08

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 564339)
¿Con qué versión de Delphi estás trabajando?

DELPHI 2005

Neftali [Germán.Estévez] 08-05-2025 13:49:02

Pensaba que tal vez era más antigua.
Tendrás que hacer pruebas cambiando codificación. Yo creo que puede ir por ahí...

navbuoy 17-05-2025 16:44:01

El problema esta en esta linea:

Código Delphi [-]
OutputLine := WideString(Buffer);

Ese cast no convierte correctamente texto con acentos o caracteres especiales si el texto viene codificado en UTF-8

Tienes que reemplazar esa línea con una conversión correcta desde UTF-8 a WideString, usando UTF8Decode, que está disponible en Delphi 2005.

Modifica esto:

Código Delphi [-]
OutputLine := WideString(Buffer);
ConsolaSalida := ConsolaSalida + OutputLine;
LOG(CONSOLAsALIDA);

por esto:

Código Delphi [-]
var
  TempStr: UTF8String;
begin
  SetString(TempStr, Buffer, BytesRead);
  OutputLine := UTF8Decode(TempStr); // Convierte UTF8 → WideString
  ConsolaSalida := ConsolaSalida + OutputLine;
  LOG(OutputLine); // También puedes loguear solo lo nuevo

Si sabés que no está usando UTF-8, sino una codificación ANSI típica (como Latin1 / Windows-1252), utiliza esto en su lugar:

Código Delphi [-]
OutputLine := AnsiToWide(Buffer);

Pero en general, UTF-8 es lo estándar moderno, así que UTF8Decode() es lo más seguro.

victor03 23-05-2025 13:50:01

Cita:

Empezado por navbuoy (Mensaje 564683)
El problema esta en esta linea:

Código Delphi [-]
OutputLine := WideString(Buffer);

Ese cast no convierte correctamente texto con acentos o caracteres especiales si el texto viene codificado en UTF-8

Tienes que reemplazar esa línea con una conversión correcta desde UTF-8 a WideString, usando UTF8Decode, que está disponible en Delphi 2005.

Modifica esto:

Código Delphi [-]
OutputLine := WideString(Buffer);
ConsolaSalida := ConsolaSalida + OutputLine;
LOG(CONSOLAsALIDA);

por esto:

Código Delphi [-]
var
  TempStr: UTF8String;
begin
  SetString(TempStr, Buffer, BytesRead);
  OutputLine := UTF8Decode(TempStr); // Convierte UTF8 → WideString
  ConsolaSalida := ConsolaSalida + OutputLine;
  LOG(OutputLine); // También puedes loguear solo lo nuevo

Si sabés que no está usando UTF-8, sino una codificación ANSI típica (como Latin1 / Windows-1252), utiliza esto en su lugar:

Código Delphi [-]
OutputLine := AnsiToWide(Buffer);

Pero en general, UTF-8 es lo estándar moderno, así que UTF8Decode() es lo más seguro.

Hola

creo que uso Latin1 el problema es que parece que la función AnsiToWide no esta en delphi 2005, le he preguntado al chatgpt y me ha montado una función pero no ha funcionado

aun así, después he probado lo del utf8Decode me ha preguntado: contains international characters. Do you wish to save this file in UTF8 encoding? If you choose 'NO', the international characters will be lost. le he dicho que 'yes' y el programa ha seguido funcionando, el decode ha funcionado a la hora de escribir en el log hasta que ha llegao a la linea que tiene un acento y la ha dejado en blanco:


Cita:

23/05/2025 13:39:37: utf8->
23/05/2025 13:39:37: WideString(AnsiToWide(Buffer))-> FACTURA|1/250090|Incorrecto|1124|El valor del campo TipoImpositivo no est* incluido en la lista de valores permitidos.


La franja horaria es GMT +2. Ahora son las 13:53:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi