• Publicidad

Character encoding en Perl/Windows

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Character encoding en Perl/Windows

Notapor Norther » 2008-01-31 18:37 @817

Al final el programa acabó funcionando, y sacando al archivo de texto lo que quería, el problema es que me saca mal tanto los caracteres rusos como los koreanos; he mirado por ahí mil páginas de encoding y probado el módulo encode de Perl pero no consigo hacer para que guarde correctamente en el archivo de texto los caracteres coreanos y rusos. Este es el resultado que obtengo:

Código: Seleccionar todo
[ITEMDEF 01db3]
DEFNAME=i_barrel_broken
RESOURCES=16 i_BOARD, 2 i_BARREL_HOOP, I_BARREL
WEIGHT=21
//broken barrel
CATEGORY=Decoration - Furniture
SUBSECTION=Broken Furniture
DESCRIPTION=Broken Barrel
NAME2=Barril Quebrado
NAME3=Baril Cassé
NAME4=los miticos cuadrados de caracter erroneo (coreano)
NAME5=Barilotto Rotto
NAME6=Gebroken Vat
NAME7=los miticos cuadrados de caracter erroneo (ruso)
DUPELIST=01db4,01db5,01db6


El código por si hace falta es el del post que hice anteriormente.
Muchas gracias
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Publicidad

Notapor explorer » 2008-01-31 20:07 @879

Analizando la página devuelta, se ve que los caracteres están codificados en utf8, por lo que a mí me parece que está bien (lo ideal es trabajar con esa codificación pues engloba a todas las lenguas conocidas).

¿En qué alfabeto quieres codificar los caracteres rusos y coreanos? Si eliges un alfabeto occidental o uno ruso o el coreano, dejas fuera a los caracteres acentuados de los otros dos alfabetos.
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

Notapor Norther » 2008-02-01 01:13 @092

Cualquier alfabeto que englobe Ruso, Koreano, Italiano, Francés y Español me sirve. En realidad con que consiga guardar sin problemas todos esos lenguajes al fichero de texto me doy por satisfecho pero no acabo de conseguir hacerlo de ninguna manera...
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2008-02-01 07:44 @363

De la familia de alfabetos iso, no conozco ninguno que englobe a todos los que dices.

Perl trabaja por defecto con iso-8859-1. Toda Europa occidental trabaja con ella, pero con la introducción del euro y para dar mejor soporte al finés y francés, ahora estamos trabajando con el iso-8859-15, que contiene los alfabetos del albanés, vasco, bretón, catalán, danés, neerlandés, inglés, estonio, feroés, finés, francés, "frisian", gallego, alemán, islandés, gaélico, italiano, latin, luxemburgués, noruego, portugués, "rhaeto-romantic", escocés, español y sueco.

El ruso está en el iso-8859-5 (latín/cirílico). Y el coreano puede ser el KSX 1001 (multibyte).

Es mejor que uses el utf8, que los tiene a todos.

Y si quieres ver si lo hace bien, debes ver ese fichero con un editor de textos compatible con esa codificación. Yo a veces uso un volcado hexadecimal para ver que efectivamente los caracteres acentuados salen con dos bytes. Otra forma de verlo sería volcar ese texto a una página html, con esa codificación, y verlo con el firefox.
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

Notapor Norther » 2008-02-01 09:19 @430

Estuve probando duramente mil maneras de hacer que lo guardará en un fichero abierto como utf8 codificando todo el texto a utf8 y haciendo mil cosas del estilo de OPEN FILE ">:utf8" "$archivo.txt"pero parece que no acabo de comprender la documentación para hacerlo, te dejo el fragmento de código para ver si se te ocurre algo...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
[...]
#!/usr/bin/perl

use WWW::Mechanize;
use warnings;
use strict;

        my $mech = WWW::Mechanize->new();
        my $url  = 'http://world.altavista.com';

        ### Al Ruso ###
        $mech->get($url);
        $mech->submit_form(
            form_number => 1,
            fields      => {
                trtext => 'casa',
                lp     => 'en_ru'
            }
        );
print ARCH2 "NAME4=$traducidaru\n";

[...]
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


De todas formas por si no entiendes bien lo que necesito si consigues ejecutar mi código de mi otro post y que guarde los resultados de ruso y demás correctamente en un txt, habrás encontrado lo que busco :P
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2008-02-01 11:15 @510

Ya encontré lo que faltaba.

Primero: no es necesario crear un objeto WWW::Mechanize dentro del bucle principal. Te vale con hacer $mech = WWW::Mechanize->new(); al principio.

Segundo, después de hacer el new(), añades esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$mech->add_header('Accept-Charset' => 'utf-8');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

que su efecto es la añadir esa línea a la cabecera de las peticiones HTTP. Ves que le estamos diciendo al servidor que aceptamos una respuesta codificada en utf-8. Si no hacemos esto, nos lo devuelve en el alfabeto que maneja WWW::Mechanize: iso-8859-1 (el mismo que el del Perl) y por lo tanto, los caracteres rusos o coreanos son convertidos al byte \0. En cambio, con esa cabecera recibimos la página con la misma codificación que está indicada en la cabecera de la propia página HTML.

Después, en el bucle principal, vas haciendo los get() y los submit(), sabiendo que estás extrayendo texto en utf8 hacia el fichero de salida.

Código: Seleccionar todo
[ITEMDEF 01e34]
DEFNAME=i_scarecrow
RESOURCES=4 i_LOG, 14 i_STRAW, i_ROPE, i_hat_straw
WEIGHT=23
CATEGORY=Items by Professions
SUBSECTION=Farmer
DESCRIPTION=Чучело
DUPELIST=01e35

[ITEMDEF 01e35]
//scarecrow
DUPEITEM=01e34
Última edición por explorer el 2008-02-01 12:11 @549, editado 1 vez en total
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

Notapor Norther » 2008-02-01 12:10 @548

Vaya, sencillamente impresionante, creo que es el último sitio donde se me habría ocurrido mirar :S muchísimas gracias explorer, la verdad es que esta vez no sabía por dónde cogerlo ;)

Actualización:
Parece que sigo haciendo algo mal por que añadí la línea para recibir y aceptar la respuesta en utf-8 y aun sigue poniéndome mal en el fichero los caracteres rusos y koreanos... :S
¿Tengo que añadir algo más aparte de eso?
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2008-02-01 12:28 @561

¿Cómo salen esos ficheros? ¿Todo ceros u otros caracteres? ¿En qué codificación está la terminal que usas para ver esos caracteres?
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

Notapor Norther » 2008-02-01 15:00 @667

Parece que vamos progresando porque ya no aparecen los cuadraditos de carácter nulo, ahora aparecen una serie de caracteres, casi exactamente estos:

Código: Seleccionar todo
[ITEMDEF 01db3]
DEFNAME=i_barrel_broken
RESOURCES=16 i_BOARD, 2 i_BARREL_HOOP, I_BARREL
WEIGHT=21
//broken barrel
CATEGORY=Decoration - Furniture
SUBSECTION=Broken Furniture
DESCRIPTION=Broken Barrel
NAME2=Barril Quebrado
NAME3=Baril Cassé
NAME4=Сломленный Бочонок
NAME5=Barilotto Rotto
NAME6=Gebroken Vat
NAME7=부서지는 배럴
DUPELIST=01db4,01db5,01db6


Y el código me quedo igual pero con la fila nueva, es decir:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use WWW::Mechanize;
use warnings;
use strict;

$mech->add_header('Accept-Charset' => 'utf-8');

my $url  = 'http://world.altavista.com';
my $archivo = 'C:\Documents and Settings\Usuario Autorizado\Escritorio\we.txt';
my $archivoesp = 'C:\Documents and Settings\Usuario Autorizado\Escritorio\wa.txt';

open( ARCH, "< $archivo" ) || die "Couldnt open the file, $!\n";
open( ARCH2, ">> $archivoesp" ) || die "Couldnt open the file, $!\n";

while (<ARCH>) {
    if ( /DESCRIPTION=(\w+\s+\w+)/i || /DESCRIPTION=(\w+\s+\w+\s+\w+)/i) {
        $palabra = $1;
        ### Al Ruso ###
        $mech->get($url);
        $mech->submit_form(
            form_number => 1,
            fields      => {
                trtext => $palabra,
                lp     => 'en_ru'
            }
        );

        $wa = $mech->content;
        (my $traducidaru) = $wa =~ /<div style=padding:10px;>(.+?)<\/div><\/td>/;
       
        print ARCH2 "NAME4=$traducidaru\n";
     }
}

close ARCH;
close ARCH2;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El error me lo da no en la consola (no muestro lo traducido por ella en ningún momento) sino en el .txt donde lo guardo con print ARCH2 "NAME4=$traducidaru\n";. El código puede tener algún error pero es un resumen al vuelo para no poner el original que es bastante grande y la idea viene a ser la misma creo, muchas gracias.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2008-02-01 20:24 @891

No hay error: esos caracteres YA son utf-8.

Otra cosa es que tu terminal o tu editor de textos sea capaz de mostrarlos, que se ve que no. Pero internamente, ese txt ya tiene caracteres utf-8.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron