• Publicidad

Leer fichero utf-8 según índices

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Leer fichero utf-8 según índices

Notapor Vertik » 2011-05-27 03:32 @189

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!
Vertik
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2011-04-20 06:32 @314

Publicidad

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

Notapor explorer » 2011-05-27 03:43 @197

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

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

Notapor Vertik » 2011-05-30 06:43 @321

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.
Vertik
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2011-04-20 06:32 @314

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

Notapor explorer » 2011-05-30 09:28 @436

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 "³".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

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

Notapor Vertik » 2012-01-31 09:58 @457

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!
Vertik
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2011-04-20 06:32 @314

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

Notapor explorer » 2012-01-31 14:09 @631

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

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

Notapor Vertik » 2012-02-01 03:18 @179

Es lo que imaginaba... ¡Gracias!
Vertik
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2011-04-20 06:32 @314


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 27 invitados