Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-07-2025
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: 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:
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.
__________________
Miguel Román

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

Última edición por mRoman fecha: 11-07-2025 a las 20:05:18.
Responder Con Cita
  #2  
Antiguo 11-07-2025
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: 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 !!
Responder Con Cita
  #3  
Antiguo 12-07-2025
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
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.
Responder Con Cita
  #4  
Antiguo 12-07-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: 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.

Última edición por navbuoy fecha: 12-07-2025 a las 17:41:06.
Responder Con Cita
  #5  
Antiguo 22-07-2025
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: 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 !!

Última edición por Casimiro Noteví fecha: 22-07-2025 a las 17:25:54.
Responder Con Cita
  #6  
Antiguo 23-07-2025
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: 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 !!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Caracteres raros al capturar fichero txt comba Varios 4 07-09-2010 17:59:07
caracteres raros en delphi unko! Varios 7 19-12-2006 11:56:34
Caracteres raros al imprimir reporte joserobertorc Impresión 0 07-01-2005 21:22:18
Caracteres Raros en Impresora de Tickets muli Impresión 7 16-04-2004 21:13:11
Caracteres raros con dbase kes Conexión con bases de datos 4 09-07-2003 20:05:15


La franja horaria es GMT +2. Ahora son las 03:28:34.


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