Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Avanzado » Problemas al convertir UCS-2  RESUELTO Responder al tema
Nuevo tema


Página 1 de 1  [ 6 mensajes ] 
 
Nota Mié Feb 03, 2010 5:15 am

Perlero Nuevo
Registrado: Mié Feb 03, 2010 4:59 am
Mensajes: 12
Problemas al convertir UCS-2
Hola. Intento leer de ucs-2 y convertir a utf-8 y me aparece el siguiente error:

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
Wide character in print at KeywordToolExternal-CSV.pl line 47, <FILE> line 3.
´╗┐Palabras clave       Competencia del anunciante      Volumen local de b├║sque
das: diciembre  Volumen global de b├║squedas mensuales
amaco regalos   0.13    -1      210


Este es el programa KeywordToolExternal-CSV.pl:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #    use Encode qw/encode decode/;
  2. #    $ucs2 = encode("UCS-2LE", $utf8);
  3. #    $utf8 = decode("UCS-2LE", $ucs2);
  4.  
  5. use Encode qw/encode decode/;
  6.  
  7. my ($Fila,$contenido,$contenido_nuevo);
  8. open (FILE, "palabras.csv");
  9. while(<FILE>){
  10. $Fila = $_;
  11. $contenido .= "$Fila";
  12. }
  13.  
  14. $contenido_nuevo = encode("UCS-2BE", $contenido);
  15.  
  16. print $contenido_nuevo;


Nota Mié Feb 03, 2010 7:36 am

Perlero Nuevo
Registrado: Lun Nov 24, 2008 8:07 am
Mensajes: 9
Re: Problemas al convertir UCS-2
Prueba esto:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. open my $file, "<:encoding(UCS-2LE)", "palabras.csv";
  2.  
  3. while(<$file>){
  4.  
  5. ...
  6.  


Nota Mié Feb 03, 2010 9:22 am

Perlero Nuevo
Registrado: Lun Nov 24, 2008 8:07 am
Mensajes: 9
Re: Problemas al convertir UCS-2
Mira también esta página:

http://ahinea.com/en/tech/perl-unicode-struggle.html


Nota Mié Feb 03, 2010 10:50 am

Perlero Nuevo
Registrado: Mié Feb 03, 2010 4:59 am
Mensajes: 12
Re: Problemas al convertir UCS-2
Lo solucioné así, gracias...

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. open my $file, "<:encoding(UCS-2LE)", "palabras.csv";
  2. while(<$file>) {
  3.     $Fila = $_;
  4.     $Contenido .= $Fila;
  5. }
  6. close $file;
  7.  
  8. open my $file_utf8, ">:encoding(UTF-8)","palabras-utf8.txt";
  9. print $file_utf8 "$Contenido";
  10. close $file_utf8;


Nota Mié Feb 03, 2010 12:18 pm
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9518
Re: Problemas al convertir UCS-2  RESUELTO
Bienvenido a los foros de Perl en Español, Dgrande.

Supongamos que tenemos el fichero ucs2.txt:

Esto es una prueba de ucs2. áéíóúñÑ

que internamente, vemos que está codificado en UCS2:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
explorer@joaquin:~/Documents/Desarrollo> hexdump -C ucs2.txt
00000000  ff fe 45 00 73 00 74 00  6f 00 20 00 65 00 73 00  |..E.s.t.o. .e.s.|
00000010  20 00 75 00 6e 00 61 00  20 00 70 00 72 00 75 00  | .u.n.a. .p.r.u.|
00000020  65 00 62 00 61 00 20 00  64 00 65 00 20 00 75 00  |e.b.a. .d.e. .u.|
00000030  63 00 73 00 32 00 2e 00  20 00 e1 00 e9 00 ed 00  |c.s.2... .......|
00000040  f3 00 fa 00 f1 00 d1 00  0a 00                    |..........|
0000004a

Incluso tiene la cabecera típica de la codificación, en los dos primeros bytes.

Este programa nos lo cambia a UTF8:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl
open my $UCS2, '<:encoding(UCS-2LE)', 'ucs2.txt' or die "ERROR: $!\n";
open my $UTF8, '>:encoding(UTF-8)', 'utf8.txt'   or die "ERROR: $!\n";

read  $UCS2, my $buffer, -s 'ucs2.txt';
print $UTF8 $buffer;

close $UCS2;
close $UTF8;

Vemos la salida:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
explorer@joaquin:~/Documents/Desarrollo> hexdump -C utf8.txt
00000000  ef bb bf 45 73 74 6f 20  65 73 20 75 6e 61 20 70  |...Esto es una p|
00000010  72 75 65 62 61 20 64 65  20 75 63 73 32 2e 20 c3  |rueba de ucs2. .|
00000020  a1 c3 a9 c3 ad c3 b3 c3  ba c3 b1 c3 91 0a        |..............|
0000002e

Observa que también te respeta las cabeceras de los ficheros.

Obtendrías el mismo resultado si lo hicieras usando el open pragma:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use open IN => ':encoding(UCS-2LE)', OUT => ':encoding(UTF-8)';
  2.  
  3. open my $UCS2, '<', 'ucs2.txt' or die "ERROR: $!\n";
  4. open my $UTF8, '>', 'utf8.txt' or die "ERROR: $!\n";


Y usando Encode:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Encode qw(from_to);
  3.  
  4. open my $UCS2, '<', 'ucs2.txt' or die "ERROR: $!\n";
  5. open my $UTF8, '>', 'utf8.txt' or die "ERROR: $!\n";
  6.  
  7. read  $UCS2, my $buffer, -s 'ucs2.txt';
  8.  
  9. from_to($buffer,'ucs-2le','utf8');
  10.  
  11. print $UTF8 $buffer;
  12.  
  13. close $UCS2;
  14. close $UTF8;


Recuerda que la codificación por defecto, en Perl, es la ISO-8859-1, y Perl la usará, bien a la entrada y/o a la salida, si no le decimos lo contrario. O si tratamos los octetos leídos como una determinada codificación. Si queremos asegurarnos de que Perl no va a tocar nada mientras leemos o escribimos, añadimos las líneas
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. binmode $UCS2;
  2. binmode $UTF8;
justo después de los open(). También se pueden indicar las codificaciones ahí.

Fíjate también que he usado read() para leer el fichero. El comportamiento de read() es también distinto según la codificación del fichero: por defecto, es en bytes, pero si definimos una codificación distinta, el comportamiento será en caracteres.

En los códigos indico a read que lea -s 'ucs2.txt', que es el tamaño del fichero en bytes. Pero si yo he definido antes (en el open o en open pragma, binmode, etc) que es otra codificación distinta, intentará leer caracteres. Y sabemos que esas dos cifras son distintas: el fichero ucs2.txt ocupa 74 bytes en mi disco, pero solo tiene 36 caracteres. read() intentará leer 74 caracteres, pero solo leerá 36. No importa, porque sé que el número de bytes siempre es mayor que el de caracteres. Pasaría lo mismo con otra codificación: en utf8 el fichero ocupa 46 bytes.

_________________
JF^D Perl programming


Nota Vie Feb 05, 2010 4:24 am

Perlero Nuevo
Registrado: Mié Feb 03, 2010 4:59 am
Mensajes: 12
Re: Problemas al convertir UCS-2
Gracias por todo.
Un saludo.


Responder al tema  [ 6 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