• 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.

Notapor Norther » 2008-02-02 00:45 @073

Pues no encuentro manera de que muestre bien los caracteres en windows, ni con notepad ni wordpad ni nada de nada :S
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Publicidad

Notapor explorer » 2008-02-02 04:50 @243

Sí, es que Windows es un sistema operativo antiguo y poco preparado para el desarrollo de sistemas. Por eso ahora todo el mundo usa Linux.

Quítalo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2008-02-02 11:07 @505

Pero si yo uso Ubuntu, exclusivamente desde Ubuntu Feisty Fawn :S Pero el programa se lo estoy haciendo a un amigo que lo necesita y el se niega a pasarse a Linux... Probé a mostrar los caracteres por consola y tampoco los muestra bien, estoy empezando a plantearme seriamente si de verdad esos caracteres están bien en alguna parte, jaja

Voy a intentar a la desesperada hacerle una GUI con Perl/Tk y mostrar el texto traducido en un Label o en un campo text para que se pueda copiar, si se te ocurre algo más que pueda funcionar no dudes en decírmelo. ¡¡Me niego a pensar que sea imposible de hacer!!


-----EDIT-----

Tampoco funciona mostrandolo en un campo text en perl/tk :S
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2008-02-02 12:14 @551

Si copio y pego las líneas que te salen, en un fichero de texto, y las veo con el firefox, y en el firefox le digo que la codificación es utf-8, me sale:

Código: Seleccionar todo
NAME3=Baril Cassé
NAME4=Сломленн�?й �?о�?онок
NAME5=Barilotto Rotto
NAME6=Gebroken Vat
NAME4=鬼剋棘劇剋筠戟戟�橘 �棘�棘戟棘克


Los caracteres que salen "desconocidos" es porque esa letra no está definida dentro del fichero de fuente de letras que estás usando para ver el texto. Es decir: para ver coreano, deberás tener en el ordenador una fuente de letras de coreano.

A propósito... acabo de descubrir que las letras en coreano no están en utf-8, sino en euc-kr. Eso quiere decir que altavista NO siempre responde con la misma codificación. El texto que te pongo lo he copiado y pegado cambiando la codificación en el editor de texto Kate.

Esto es normal, si ves el funcionamiento de firefox: mientras estás trabajando con caracteres occidentales está trabajando con una determinada fuente de letras, pero cuando cambias a una asiática, carga otra fuente de letras distinta. La explicación es que no es muy común tener todos los alfabetos en un único fichero de fuente de letras. En cambio, si una fuente de letras dice que admite la codificación utf-8 entonces debemos pensar que sí debería de mostrar una gama muy amplia de alfabetos.

En el texto anterior, si eres capaz de ver los textos en cirílico al mismo tiempo que los caracteres coreanos, entonces es que tu navegador está usando un tipo de letra que admite ambos alfabetos. Curiosamente, este página web que estás viendo está codificada en iso-8859-1. Los caracteres están codificados como entidades HTML (mira el código de esta página): el acento agudo del francés se ve directamente (porque está contemplado en iso-8859-1), pero los del cirílico ruso están como entidades codificadas con números superiores a 1050. Y los coreanos, entre el 20.000 y el 40.000.

Si tu fuente de letras del navegador no tiene un conjunto de letras tan amplio, es cuando verás los caracteres "caja", indicando que no sabe cómo pintar esa letra. Yo estoy usando monoespaciada en OpenSuse 10.3 y sí que me muestra 'casi' todos los caracteres.

Lo interesante de este problema va más allá de lo que puede hacer el programa: depende de la codificación y el fuente de letras que esté usando el sistema operativo.

Si lo vas a pasar a Perl/Tk, quizás una posibilidad sea usar algún widget del tipo cliente de HTML.

Lo que sí está claro es que NO puedes mezclar varias codificaciones en el mismo fichero.

Bienvenido a la torre de Babel.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2008-02-02 12:53 @579

Me colé otra vez... Altavista SIEMPRE devuelve en utf-8.

El siguiente programa hace lo que pides: lee un fichero de entrada y va sacando la traducción. Y todos los caracteres, en utf-8.

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

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

my $url  = 'http://world.altavista.com/tr';
my $archivo = 'kk.txt';
my @idiomas = qw[
        en_es
        en_fr
        en_ru
        en_it
        en_nl
        en_ko
];
my $mech = WWW::Mechanize->new();
$mech->add_header('Accept-Charset' => 'utf-8');
$mech->get($url);

open( ARCH, "< $archivo" ) or die "ERROR al leer el archivo: $!\n";
open (OUT, "> kk1.txt")    or die "ERROR al escribir la salida: $!\n";

while (<ARCH>) {

    print OUT;

    if ( /DESCRIPTION=(.+)/i ) {
        my $ingles = $1;
        print "Traducir $ingles:\n";

        my $n = 'NAME2';
        foreach my $idioma ( @idiomas ) {

            print "  $n  ";
            $mech->submit_form(
                with_fields => {
                    trtext => $ingles,
                    lp     => $idioma,
                }
            );

            my $wa = $mech->content;
            (my $traducida) = $wa =~ /<div style=padding:10px;>(.+?)<\/div><\/td>/;

            print "$traducida\n";
            print OUT "$n=$traducida\n";

            sleep 3;
            $n++;
        }
    }
}

close OUT;
close ARCH;

__END__
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Hay una serie de cambios con respecto a lo hecho antes:
* La $url es directamente la del formulario de traducción
* Hacemos un bucle por todos los @idiomas. Usamos un array y un bucle foreach para simplificar código
* El get() solo es necesario hacer una vez. Cuando hacemos el submit(), nos devuelve la misma página
* Usamos el truco de Perl de incrementar textos, para pasar de 'NAME2' a 'NAME3', etc, con un solo '$n++'
* En el submit_form(), no indicamos el número de formulario dentro de la página, sino que sea Mechanize el que busque el formulario con esos campos (with_fields)
* Ponemos un sleep 3 para que los dueños de Altavista no se quejen.

Dado un fichero de texto inicial:
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
DUPELIST=01db4,01db5,01db6


La salida en consola es:
Código: Seleccionar todo
Traducir Broken Barrel:
  NAME2  Barril Quebrado
  NAME3  Baril Cassé
  NAME4  Сломленный Бочонок
  NAME5  Barilotto Rotto
  NAME6  Gebroken Vat
  NAME7  부서지는 배럴


Y el fichero generado es:
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

¡Sale perfecto!
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2008-02-03 14:03 @627

En efecto, tenías toda la razón. Le añadió las fuentes koreana, rusa, y algunas más extra, y ya funciona perfectamente, muchas gracias explorer, a ver si poco a poco cosas como estas convencen a mi amigo a pasarse a Linux, jaja
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados

cron