Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Conexión con bases de datos
Register FAQ Members List Calendar Guía de estilo Today's Posts

Conexión con bases de datos

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 11/07/2025
mRoman's Avatar
mRoman mRoman is offline
Miembro
 
Join Date: Nov 2003
Posts: 646
Poder: 23
mRoman Va por buen camino
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:
Code:
20250318071
El dato completo es este:

Code:
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.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Last edited by mRoman : 11/07/2025 at 20:05.
Reply With Quote
  #2  
Old 11/07/2025
mRoman's Avatar
mRoman mRoman is offline
Miembro
 
Join Date: Nov 2003
Posts: 646
Poder: 23
mRoman Va por buen camino
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??
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Reply With Quote
  #3  
Old 12/07/2025
Casimiro Noteví's Avatar
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Join Date: Sep 2004
Location: En algún lugar.
Posts: 32,682
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
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.
Reply With Quote
  #4  
Old 12/07/2025
navbuoy navbuoy is offline
Miembro
 
Join Date: Mar 2024
Posts: 360
Poder: 3
navbuoy Va por buen camino
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.

Last edited by navbuoy : 12/07/2025 at 17:41.
Reply With Quote
  #5  
Old 22/07/2025
mRoman's Avatar
mRoman mRoman is offline
Miembro
 
Join Date: Nov 2003
Posts: 646
Poder: 23
mRoman Va por buen camino
Gracias "navbuoy", lo probaré y les comento como quedó.

Saludos y gracias por su tiempo a todos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Last edited by Casimiro Noteví : 22/07/2025 at 17:25.
Reply With Quote
  #6  
Old 23/07/2025
mRoman's Avatar
mRoman mRoman is offline
Miembro
 
Join Date: Nov 2003
Posts: 646
Poder: 23
mRoman Va por buen camino
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.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Caracteres raros al capturar fichero txt comba Varios 4 07/09/2010 17:59
caracteres raros en delphi unko! Varios 7 19/12/2006 11:56
Caracteres raros al imprimir reporte joserobertorc Impresión 0 07/01/2005 21:22
Caracteres Raros en Impresora de Tickets muli Impresión 7 16/04/2004 21:13
Caracteres raros con dbase kes Conexión con bases de datos 4 09/07/2003 20:05


All times are GMT +2. The time now is 23:07.


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
Copyright 1996-2007 Club Delphi