Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Convertir cualquier texto a UTF-8 Responder al tema
Nuevo tema


Página 1 de 1  [ 10 mensajes ] 
 
Nota 2011-07-18 10:03 @461

Perlero Nuevo
Registrado: 2011-04-20 06:32 @314
Mensajes: 35
Convertir cualquier texto a UTF-8
Hola a todos,

Quiero hacer un conversor de cualquier tipo de codificación a UTF-8. Lo que sucede es que no he de saber la codificación del fichero origen.

He leído que hay la función Guess, pero que a veces podría generar errores.

¿¿¿Cómo puedo lidiar con un fichero con diferentes encodings???

¿¿Alguna ayudita??

¡Gracias! :)


Nota 2011-07-18 16:17 @720
Avatar de Usuario
Vive para Perl en Español
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor
Mensajes: 592
Re: Convertir cualquier texto a UTF-8
Con el comando piconv lo puedes convertir, pero tienes que saber la codificación. Para saber la codificación en la que el texto está puedes usar el comando file si estás en UNIX o algún derivado.

_________________
Expect the worst, is it the least you can do?


Nota 2011-07-19 07:48 @367

Perlero Nuevo
Registrado: 2011-04-20 06:32 @314
Mensajes: 35
Re: Convertir cualquier texto a UTF-8
Sí, pero si estoy leyendo un texto de algún web, éste puede tener diferentes codificaciones... entonces, ¿cómo se hace para un texto con múltiple encondings? Porque el file solo devuelve un solo tipo, ¿no?

Gracias


Nota 2011-07-19 08:13 @384

Perlero Nuevo
Registrado: 2011-04-20 06:32 @314
Mensajes: 35
Re: Convertir cualquier texto a UTF-8
explorer, en otro post comentó:

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
Yo hubiera usado la función from_to() del módulo Encode. Primero, leer el fichero como una ristra de bytes (sin código), hacer la transformación, y grabarlo de la misma manera (codificación :raw).


¿Esto quiere decir, que lees el fichero en bytes sin importar la codificación ni nada, a "pelo" y luego vas escribiendo los bytes a un fichero que le puedes poner tu la codificación que quieras?

Gracias

Edito:

Creo que ya funciona, los expertos si lo queréis mirar y valorar la solución (sería genial para mi xD)

Veréis, este es el código

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.  my $enc = guess_encoding($linea, qw/euc-jp shiftjis 7bit-jis/);
  2.     ref($enc) or die "Can't guess: $enc"; # trap error this way
  3.     my $utf8 = $enc->decode($linea);


Uso la función guess_encoding(), para saber de qué codificación se trata, y luego la descodifico y la paso a utf8.

¿¿Qué os parece??

Gracias de nuevo


Nota 2011-07-19 11:52 @536
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Convertir cualquier texto a UTF-8
Vertik escribió:
Sí, pero si estoy leyendo un texto de algún web, éste puede tener diferentes codificaciones...
Las páginas web indican en qué codificación están, bien a través de un marca <meta> con atributo charset:

<META http-equiv="Content-Type" content="text/html; charset=iso-8859-15">

O a través de las cabeceras HTTP que devuelve el servidor web:

Content-Type: text/html; charset=EUC-JP

Vertik escribió:
entonces, ¿cómo se hace para un texto con múltiple encondings? Porque el file solo devuelve un solo tipo, ¿no?
Si un texto, sin indicaciones o marcas que lo indiquen, tiene una o más codificaciones distintas, puede ser muy difícil averiguar a qué codificación corresponde. Para los ordenadores, todos los archivos son una ristra de bytes. Pero sí hay pistas para distinguir algunas codificaciones. Pero no todas.

La función guess_encoding() es del módulo Encode::Guess. Mira el primer punto de la sección caveats de la página del manual. Dice que las codificaciones de un simple byte (como la nuestra, la iso-8859-15), son muy difíciles de adivinar porque cubren todo el rango de bytes posibles (del 0 al 255). Y el sistema que usa es de prueba y error, línea a línea del texto, descartando sospechosos.

_________________
JF^D Perl programming


Nota 2011-07-20 08:40 @403

Perlero Nuevo
Registrado: 2011-04-20 06:32 @314
Mensajes: 35
Re: Convertir cualquier texto a UTF-8
Entiendo lo que quieres decir.

Pero, veamos si la siguiente idea te gusta y me orientas un poco a cómo hacerla.

Coger el texto y dividirlo por frases y a cada frase, le aplicamos una búsqueda del encoding. Si lo encuentra, lo traduce, y seguimos a la siguiente; sino, sabemos que tenemos un error, pero seguimos.

El código sería algo así:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $find=0;
  2. $error=0;
  3. foreach my $linea ( <$fileIn> ) {
  4.         $find=0;
  5.         my $i=0;
  6.         while($i<@encodings or !$find){
  7.                 my $enc = guess_encoding($linea, $econdings[$i]);
  8.                 my $utf8;
  9.                 if(ref($enc)){
  10.                         $utf8 = $enc->decode($linea);
  11.                         $find=1;
  12.                         print $openFileHandle $utf8;
  13.                 }
  14.                 $i++;
  15.         }
  16.         if(!$find){
  17.                 $error=1
  18.                 print $openFileHandle $linea;
  19.         }
  20. }
  21. if(!$error){
  22. print "Contiene caracteres no codificados";    
  23. }


¿Esto es viable o es una idiotez? Si es viable, ¿cuál sería la mejor manera de crear el array de encondings? es decir, ¿cuál sería la mejor agrupación de encondings entre ellos?

Gracias


Nota 2011-07-20 11:10 @507
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Convertir cualquier texto a UTF-8
Pero es que ese trabajo de analizar línea a línea ya lo hace Encode::Guess... Solo tienes que pasarle a guess_encoding() todo el texto, y ella ya se encargará de trabajar línea a línea.

_________________
JF^D Perl programming


Nota 2011-07-20 14:28 @644

Perlero Nuevo
Registrado: 2011-04-20 06:32 @314
Mensajes: 35
Re: Convertir cualquier texto a UTF-8
Vale... entiendo, pero la idea de agrupar según su tipología los encodings para encontrar el correcto, ¿es buena?

¿Cuál crees que sería la mejor agrupación?


Nota 2011-07-20 14:37 @650
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Convertir cualquier texto a UTF-8
Pues lo siento, pero no tengo tanta experiencia con las distintas codificaciones, como para poder responder esa pregunta.

_________________
JF^D Perl programming


Nota 2011-07-21 02:45 @156

Perlero Nuevo
Registrado: 2011-04-20 06:32 @314
Mensajes: 35
Re: Convertir cualquier texto a UTF-8
Ok, ¡no pasa nada! ¡Más que me has respondido y ayudado, es imposible!

Dejo el tema en standby. Lo pondré a resuelto con la agrupación que use.

¡Muchas gracias!


Responder al tema  [ 10 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO