* * *

Author Topic: Problema con tildes al abrir fichero de texto  (Read 414 times)

BlueIcaro

  • Hero Member
  • *****
  • Posts: 523
Problema con tildes al abrir fichero de texto
« on: September 04, 2017, 07:31:19 pm »
Hola, tengo un problema con las tíldes.
Mi aplicación abre un fichero que contiene tildes, por ejemplo, en una línea hay:

Quote
funcionalidad de sincronización

Si lo abro con el notepad++ por ejemplo sale la tilde correctamente, pero al abrirlo en un programa mío, aparece así

Quote
funcionalidad de sincronizaci?n

Como veis la tilde fue cambiada por el símbolo de admiración.
El fichero lo cargo en un TstringList, y luego voy leyendo línea a línea

¿Cómo puedo hacer para solucionar el problema?.

Gracias

Saludos

/BlueIcaro
« Last Edit: September 04, 2017, 07:33:24 pm by BlueIcaro »
Remenber, the lazarus wiki is your friend: http://wiki.lazarus.freepascal.org/Main_Page
General questions (several lenguages) http://wiki.lazarus.freepascal.org/

bylaardt

  • Full Member
  • ***
  • Posts: 244
Re: Problema con tildes al abrir fichero de texto
« Reply #1 on: September 04, 2017, 08:11:07 pm »
notepad necesita el BOM al principio del archivo.
inserta lo para hacer funcionar correctamente.
#239+#187+#191

Edson

  • Hero Member
  • *****
  • Posts: 773
Re: Problema con tildes al abrir fichero de texto
« Reply #2 on: September 04, 2017, 08:55:35 pm »
Seguro que tu fichero está codificado en ANSI, pero Lazarus, trabaja en UTF-8.

Hay diversas funciones de conversión dentro de Lazarus, que te pueden ayudar.

Yo uso esta rutina para detectar la codificación y el tipo de salto de línea:

Code: Pascal  [Select]
  1. procedure VerTipoArchivo(archivo: string; var Formato: TLineEnd; var Codificacion: string);
  2. (*Obtiene el tipo de delimitador de línea (Line Ending) de un archivo de texto, explorando
  3.  los primeros bytes de archivo. Solo explora los primeros 8K del archivo.
  4.  Si no encuentra un salto de línea en ese tamaño, no podrá deetrminar de que tipo de
  5.  archivo se trata. También explora el posible tipo de codificación usado.
  6.  *)
  7. const TAM_BOL = 8192;
  8. var ar: file;
  9.     bolsa : Array[0..TAM_BOL] of char;  //deja un byte más para el delimitador
  10.     Pbolsa: PChar;  //variable Pchar para "bolsa"
  11.     Pos13: Word;    //posición de caracter #13
  12.     Pos10: Word;    //posición de caracter #10
  13.     Leidos: Word;   //bytes leidos
  14. begin
  15.    //Lee bloque de datos
  16.    AssignFile(ar,archivo);
  17.    reset(ar,1);  { TODO : Dio error al abrir un archivo de solo lectura }
  18.    BlockRead(ar, bolsa{%H-}, TAM_BOL, Leidos{%H-});  //Lectura masiva
  19.    CloseFile(ar);
  20.    bolsa[Leidos] := #0; //agrega delimitador
  21.    Pbolsa := @bolsa;    //cadena PChar
  22.    //Explora en busca de delimitadores de línea
  23.    Pos13 := Pos(#13, Pbolsa);
  24.    Pos10 := Pos(#10, Pbolsa);
  25.    if Pos13 = 0 then
  26.       //solo hay separador #10 o ninguno
  27.       if Pos10<>0 then
  28.          Formato := TAR_UNIX     //solo hay #10
  29.       else
  30.          Formato := TAR_DESC  //no se encontró separador
  31.    else if Pos10 = 0 then
  32.       //solo hay separador #13 o ninguno
  33.       if Pos13 <> 0 then
  34.          Formato := TAR_MAC     //solo hay #13
  35.       else
  36.          Formato := TAR_DESC  //no se encontró separador
  37.    else if Pos10 = Pos13 + 1 then
  38.       Formato := TAR_DOS    //no se encontró #13#10
  39.    else
  40.       Formato := TAR_DESC;  //no se reconoce delimitadores
  41.    //Analiza codifiación
  42.    Codificacion := GuessEncoding(Pbolsa);  //analiza los primeros bytes
  43. end;
Lazarus 1.6 - FPC 3.0.0 - x86_64-win64 on  Windows 7

BlueIcaro

  • Hero Member
  • *****
  • Posts: 523
Re: Problema con tildes al abrir fichero de texto
« Reply #3 on: September 05, 2017, 07:04:14 pm »
Gracias por el procedimiento Edson, pero no logro compilarlo para probarlo.
No reconoce TLineEnd.
¿Dónde está declarado este tipo de dato?
Gracias
Saludos
Remenber, the lazarus wiki is your friend: http://wiki.lazarus.freepascal.org/Main_Page
General questions (several lenguages) http://wiki.lazarus.freepascal.org/

Edson

  • Hero Member
  • *****
  • Posts: 773
Re: Problema con tildes al abrir fichero de texto
« Reply #4 on: September 05, 2017, 07:54:16 pm »
Es que es parte de una librería: https://github.com/t-edson/SynFacilUtils/blob/1.21/SynFacilUtils.pas

y  TLineEnd es:

Code: Pascal  [Select]
  1.  //Tipos de delimitador de línea de archivo.
  2.   TLineEnd = (TAR_DESC,    //Tipo desconocido
  3.              TAR_DOS,     //Tipo Windows/DOS
  4.              TAR_UNIX,    //Tipo Unix/Linux
  5.              TAR_MAC      //Tipo Mac OS
  6. );

Pero realmente el trabajo duro de identificación de la codificación lo hace GuessEncoding().
Lazarus 1.6 - FPC 3.0.0 - x86_64-win64 on  Windows 7

JuhaManninen

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 3086
  • I like bugs.
Re: Problema con tildes al abrir fichero de texto
« Reply #5 on: September 05, 2017, 11:44:38 pm »
Mi aplicación abre un fichero que contiene tildes,...
Pienso que hoy, en 2017, todos ficheros textuales debería ser Unicode. Cambia su codificación un vez en text editor y despues funcionan bien.

« Last Edit: September 05, 2017, 11:47:15 pm by JuhaManninen »

BlueIcaro

  • Hero Member
  • *****
  • Posts: 523
Re: Problema con tildes al abrir fichero de texto
« Reply #6 on: September 06, 2017, 03:20:22 pm »
El archivo que leo, lo genera un máquina industrial (por cierto es sueca y el sistema operativo es VxWorks), son un listado de errores, la máquina los genera en diferentes idiomas. Quizás cambie la coficación según el idioma que tenga, no lo sé. En cuanto pueda lo averiguo.

@Edson, al final usando GuessEncoding(), averigué que la codificación del archivo era CP1252. Así que usando la función CP1252ToUTF8, resolví el problema.

@JuhaManninen, no entiendo bien a que te refieres cuando dices que debería ser todo unicode. Te refieres al fichero que lee mi programa en Lazarus?, o que debería convertir las cadenas a unicode en el momento que las leo en mi programa?.

Saludos

/BlueIcaro

P.D. @JuhaManninen, no me imaginaba que supieras castellano, pensé que no eras hispanoparlante, por el nombre.
Remenber, the lazarus wiki is your friend: http://wiki.lazarus.freepascal.org/Main_Page
General questions (several lenguages) http://wiki.lazarus.freepascal.org/

JuhaManninen

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 3086
  • I like bugs.
Re: Problema con tildes al abrir fichero de texto
« Reply #7 on: September 06, 2017, 11:53:57 pm »
@JuhaManninen, no entiendo bien a que te refieres cuando dices que debería ser todo unicode. Te refieres al fichero que lee mi programa en Lazarus?, o que debería convertir las cadenas a unicode en el momento que las leo en mi programa?.
Refiero a que ANSI páginas de codificación son residuo de historia. Nadie debe usarlos mas. Con internet tenemos una mezcla de lenguas y los ANSI páginas hacen un caos.
Unicode ha estado aquí > 20 años y resolve los problemas. Porqué cada uno no usalo?
Con Lazarus tambien todo es mas fácil con Unicode. No GuessEncoding(), no conversiónes explícitos...

Quote
P.D. @JuhaManninen, no me imaginaba que supieras castellano, pensé que no eras hispanoparlante, por el nombre.
No hablo o escribo bien. Necesito usar diccionario aqui.
Soy finlandés pero he estudiado español un poco y visitado España algunos veces. Normalmente hablo mejor despues de 2 o 3 copitas de vino.  :)
« Last Edit: September 08, 2017, 09:59:09 am by JuhaManninen »

 

Recent

Get Lazarus at SourceForge.net. Fast, secure and Free Open Source software downloads Open Hub project report for Lazarus