Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Caracteres Raros Inicio Cadena (https://www.clubdelphi.com/foros/showthread.php?t=97578)

mRoman 11-07-2025 20:01:44

Caracteres Raros Inicio Cadena
 
Hola Amigos, nuevamente solicitando su apoyo y EXPERTIS en delphi

Trabajo con: Delphi6, W10, FB 2.0.

Les cuento, estoy trabajando con archivo planos separados por PIPEs ("|"). Para esto estoy usando archivo .INI para definir la estructura del archivo, componentes ADO y DBGRID para mostrar los datos. Pero estoy viendo q en la primera fila (no del archivo) si no en el DBGRID, en la primer columna aparacen unos caracteres raros -supongo que ha de ser para identificar el incio del archivo- los cuales ocupan espacio y no muestra la cadena completa:
Código:

20250318071
El dato completo es este:

Código:

20250318071034
Como le hago para que no muestre estos caracteres?? "". Abri el archivo con el bloc de notas para revisar que codificacion tiene, y es "UTF-8 con BOM"....

Gracias de antemano.

mRoman 11-07-2025 20:38:14

Ya vi como quitarselo.

Edité el archivo en el bloc de notas y le cambié la codificacion al archivo a UTF-8 y con eso quitó los caracteres raros en el DBGRID....

Existe alguna forma de cambiar la codificación automaticamente en DELPHI??

Casimiro Noteví 12-07-2025 10:06:47

Eso es el BOF de un fichero utf8 mostrado con codificación iso8859
Un utf8 puedes guardarlo con BOF o sin BOF, en tu caso trae BOF (Begin Of File)
Puedes eliminarlo sin problemas.
Aunque en tu caso creo que es BOM, begin of mark, creo que se llama, similar a lo anterior.

navbuoy 12-07-2025 17:34:51

SOLUCION DESDE DELPHI (funcion añadida)

1. Leer el archivo como texto.
2. Detectar y eliminar el BOM si está presente.
3. Guardar el contenido como UTF-8 sin BOM.

¿Qué es el BOM?
El BOM (Byte Order Mark) en UTF-8 son los tres primeros bytes del archivo:

CÓDIGO EJEMPLO EN DELPHI

Código Delphi [-]
procedure ConvertUTF8BOMtoUTF8NoBOM(const InputFile, OutputFile: string);
var
  FileStream: TFileStream;
  StringStream: TStringStream;
  BOM: array[0..2] of Byte;
begin
  FileStream := TFileStream.Create(InputFile, fmOpenRead or fmShareDenyWrite);
  try
    // Leer los 3 primeros bytes para detectar el BOM
    FileStream.ReadBuffer(BOM, 3);

    if (BOM[0] = $EF) and (BOM[1] = $BB) and (BOM[2] = $BF) then
    begin
      // Si tiene BOM, creamos un TStringStream con el resto del contenido
      StringStream := TStringStream.Create('', TEncoding.UTF8);
      try
        StringStream.CopyFrom(FileStream, FileStream.Size - 3);
        StringStream.SaveToFile(OutputFile, TEncoding.UTF8); // guarda sin BOM
      finally
        StringStream.Free;
      end;
    end
    else
    begin
      // No tenía BOM, así que copiamos tal cual
      FileStream.Position := 0;
      StringStream := TStringStream.Create('', TEncoding.UTF8);
      try
        StringStream.CopyFrom(FileStream, FileStream.Size);
        StringStream.SaveToFile(OutputFile, TEncoding.UTF8); // guarda sin BOM
      finally
        StringStream.Free;
      end;
    end;
  finally
    FileStream.Free;
  end;
end;

Cómo usarlo:

Código Delphi [-]
ConvertUTF8BOMtoUTF8NoBOM('C:\Ruta\archivo_original.ini', 'C:\Ruta\archivo_sin_BOM.ini');

o puedes incluso sobreescribirlo si quieres:

Código Delphi [-]
ConvertUTF8BOMtoUTF8NoBOM('C:\Ruta\mi_archivo.ini', 'C:\Ruta\mi_archivo.ini');

Esa línea:

Código Delphi [-]
if (BOM[0] = $EF) and (BOM[1] = $BB) and (BOM[2] = $BF)

lo que hace es detectar los tres primeros caracteres del archivo codificados como bytes y comprobar si coinciden con la marca BOM de UTF-8, que son estos tres bytes hexadecimales:

$EF = 239 = ï

$BB = 187 = »

$BF = 191 = ¿

Entonces, si ese BOM se interpreta como texto (por ejemplo, en un Memo.Lines.Text), lo que vas a ver es:

Código Delphi [-]


Esos son los caracteres raros que ves al principio de muchos archivos .ini, .txt, .json, etc., guardados como UTF-8 con BOM.

mRoman 22-07-2025 16:45:32

Gracias "navbuoy", lo probaré y les comento como quedó.

Saludos y gracias por su tiempo a todos.

mRoman 23-07-2025 19:53:27

Solucionado
 
Hola buenos dias.

El código que me proporcionó "navbuoy" me ayudo, me orientó a como solucionarlo. El problema con ese código es que no es para la version de Delphi que estoy usando (D6), por lo tanto lo cambie y quedó de este forma:

Código Delphi [-]
procedure RemoveBOMFromFile(const FileName: string);
const
  BOM: array[0..2] of Byte = ($EF, $BB, $BF); // UTF-8 BOM
var
  FileStream: TFileStream;
  TempStream: TMemoryStream;
  Buffer: array[0..2] of Byte;
  HasBOM: Boolean;
begin
  FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  TempStream := TMemoryStream.Create;
  try
    // Leer primeros 3 bytes
    FileStream.ReadBuffer(Buffer, 3);
    HasBOM := (Buffer[0] = BOM[0]) and (Buffer[1] = BOM[1]) and (Buffer[2] = BOM[2]);

    if HasBOM then
    begin
      // Si tiene BOM, copiar el resto del archivo sin los primeros 3 bytes
      TempStream.CopyFrom(FileStream, FileStream.Size - 3);
    end
    else
    begin
      // Si no tiene BOM, copiar todo el archivo desde el inicio
      FileStream.Position := 0;
      TempStream.CopyFrom(FileStream, FileStream.Size);
    end;
  finally
    FileStream.Free;
  end;

  // Reescribir archivo sin BOM
  FileStream := TFileStream.Create(FileName, fmCreate);
  try
    TempStream.Position := 0;
    FileStream.CopyFrom(TempStream, TempStream.Size);
  finally
    TempStream.Free;
    FileStream.Free;
  end;
end;


Y lo mando llamar asi:
Código Delphi [-]
  FLBox.Directory:='.\';

  for x:=0 to FLBox.Count - 1 do
  begin
      RemoveBOMFromFile(FLBox.Items.Strings[x]);
  end;

Agregue un componente TFileListBox para agregar ahi los archivos que se van a procesar y tomar de ahi el nombre, que es enviado como parámetro al procedimiento "RemoveBOMFromFile".

Gracias a todos.


La franja horaria es GMT +2. Ahora son las 11:29:23.

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