Página 1 de 1

Leer fichero utf-8 según índices

NotaPublicado: 2011-05-27 03:32 @189
por Vertik
Hola a todos,

Tengo un problemilla al leer un fichero de texto en formato utf-8 without BOM (para tenerlo todo especificado, ¡je,je,je!)

El problema es que tengo un fichero que contiene los índices de inicio y final de cada palabra. Si el texto a leer no contiene ningún carácter raro, todo va perfecto, pero cuando las palabras tienen acentos o ñ, se descoloca.

Es decir,

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
En la actualidad la mejor lucha contra el cancer de mama es una deteccion temprana del tumor pues aumentaran las posibilidades de exito del tratamiento.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
En la actualidad la mejor lucha contra el cáncer de mama es una detección temprana del tumor pues aumentarán las posibilidades de éxito del tratamiento.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La salida de la lectura según los índices es totalmente diferente por problema de los acentos (obviamente, los índices han de ser los mismos para los 2 casos, ¿¿no?? xD)

¿¿Alguna idea??

¡Mil gracias!

Re: Leer fichero utf-8 según índices

NotaPublicado: 2011-05-27 03:43 @197
por explorer
No son acentos, son tildes.

Los caracteres acentuados ocupan dos octetos (bytes) en lugar de uno solo, en la codificación utf-8.

El problema está en el programa que crea los índices, quizás.

Re: Leer fichero utf-8 según índices

NotaPublicado: 2011-05-30 06:43 @321
por Vertik
Te entendí, pero no sé cómo definirlo correctamente.

Te cuento un poco la situación:

Tengo el texto A (formato ANSI (tildes y etc, en formato ó (HTML)).

A partir de aquí, voy leyendo y creo un fichero en UTF8 (texto plano) y otro fichero con los índices de inicio y fin de palabra.

El fichero A lo abro tal cual: open($fitxerVert, $parametro); sin indicarle encoding ni nada.

Para cada línea leída del fichero A hago: $linea = HTML::Entities::decode($linea); para descodificar los "patrones" como ó

Luego abro los ficheros resultantes con:
open(my $fitxerSeg1, ">:encoding(UTF-8)", "segmentado.xml");
open(my $fitxerOUT, ">:encoding(UTF-8)", "texto.txt");


Esto para la creación de los índices

Para la lectura,

open(my $fitxerOut, "<texto.txt");
binmode( $fitxerOut, ':encoding(UTF-8)');
#resultado
open(my $fitxertmp, ">prueba_elemento.txt");
binmode( $fitxertmp, ':encoding(UTF-8)');


y escribo el valor según los índices del fichero segmentado.

Entonces, mi pregunta es:

¿Cómo usar el pragma de bytes? ¿He de introducir más encode/decode?

he llegado a un punto que me sale el error:
utf8 "\xB3" does not map to Unicode

pero no sé más :(

Gracias.

Re: Leer fichero utf-8 según índices

NotaPublicado: 2011-05-30 09:28 @436
por explorer
Manejar Unicode es un tema complejo...

Te recomiendo la parte relativa a este tema, en el libro Modern Perl, de chromatic.

El otro día hubo una discusión, al respecto, bastante profunda, en Stack Overflow.

Una de las lecciones que hay que aprender es que no se debe abrir un fichero, tanto en lectura como en escritura, sin indicar la codificación en la que debe ser leído o escrito.

Quizás no debas fiarte de la longitud de los caracteres que has leído, sino de la posición del puntero del fichero abierto (función tell()).

El error que muestras, es debido a que estás leyendo un fichero en modo "UTF-8 estricto", por lo que saldrán errores en pantalla de todos los caracteres que no sea capaz de convertir. En concreto, está diciendo que se ha encontrado un byte "\xB3", que no es capaz de entenderlo como carácter UTF-8. Así que de ahí deducimos que el texto NO está en UTF-8 (o se trata de un error del propio texto).

"\xB3", por ejemplo, en codificación ISO-8859-15, es un "³".

Re: Leer fichero utf-8 según índices

NotaPublicado: 2012-01-31 09:58 @457
por Vertik
Siento recuperar un caso anterior, pero me ha salido una duda.

¿Existe en Perl la posibilidad de hacer un seek en el fichero según caracteres?, es decir,
en Java con el BufferedReader puedes leer caracteres de un fichero dando su posición (en caracteres). ¿Hay algo similar?

¡Gracias!

Re: Leer fichero utf-8 según índices

NotaPublicado: 2012-01-31 14:09 @631
por explorer
En Perl existen las funciones seek() y sysseek(), pero la que debes usar es la primera (más información en tu ordenador perldoc -f seek), que posiciona el puntero de lectura y/o escritura.

Pero si el archivo contiene caracteres UTF-8, tenemos un problema grave. seek() siempre posiciona por número de bytes, pero eso no siempre corresponde con la posición real dentro del archivo, ya que en la codificación utf-8 puede haber caracteres con uno, dos, tres o cuatro bytes.

Re: Leer fichero utf-8 según índices

NotaPublicado: 2012-02-01 03:18 @179
por Vertik
Es lo que imaginaba... ¡Gracias!