• Publicidad

Convertir cualquier texto a UTF-8

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Convertir cualquier texto a UTF-8

Notapor Vertik » 2011-07-18 10:03 @461

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

Publicidad

Re: Convertir cualquier texto a UTF-8

Notapor creating021 » 2011-07-18 16:17 @720

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?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Convertir cualquier texto a UTF-8

Notapor Vertik » 2011-07-19 07:48 @367

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

Re: Convertir cualquier texto a UTF-8

Notapor Vertik » 2011-07-19 08:13 @384

explorer, en otro post comentó:

Sintáxis: [ Descargar ] [ Ocultar ]
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).
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿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

Sintáxis: [ Descargar ] [ Ocultar ]
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);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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

Re: Convertir cualquier texto a UTF-8

Notapor explorer » 2011-07-19 11:52 @536

Vertik escribiste: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 escribiste: 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 & 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: Convertir cualquier texto a UTF-8

Notapor Vertik » 2011-07-20 08:40 @403

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í:

Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Re: Convertir cualquier texto a UTF-8

Notapor explorer » 2011-07-20 11:10 @507

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 & 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: Convertir cualquier texto a UTF-8

Notapor Vertik » 2011-07-20 14:28 @644

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

Re: Convertir cualquier texto a UTF-8

Notapor explorer » 2011-07-20 14:37 @650

Pues lo siento, pero no tengo tanta experiencia con las distintas codificaciones, como para poder responder esa pregunta.
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: Convertir cualquier texto a UTF-8

Notapor Vertik » 2011-07-21 02:45 @156

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


Volver a Intermedio

¿Quién está conectado?

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