• Publicidad

Problemas al convertir UCS-2

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Problemas al convertir UCS-2

Notapor Dgrande » 2010-02-03 05:15 @260

Hola. Intento leer de ucs-2 y convertir a utf-8 y me aparece el siguiente error:

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


Este es el programa KeywordToolExternal-CSV.pl:

Sintáxis: [ Descargar ] [ Ocultar ]
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;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Dgrande
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-02-03 04:59 @249

Publicidad

Re: Problemas al convertir UCS-2

Notapor zipf » 2010-02-03 07:36 @358

Prueba esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open my $file, "<:encoding(UCS-2LE)", "palabras.csv";
  2.  
  3. while(<$file>){
  4.  
  5. ...
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
zipf
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2008-11-24 08:07 @380

Re: Problemas al convertir UCS-2

Notapor zipf » 2010-02-03 09:22 @432

zipf
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2008-11-24 08:07 @380

Re: Problemas al convertir UCS-2

Notapor Dgrande » 2010-02-03 10:50 @493

Lo solucioné así, gracias...

Sintáxis: [ Descargar ] [ Ocultar ]
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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Dgrande
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-02-03 04:59 @249

Re: Problemas al convertir UCS-2

Notapor explorer » 2010-02-03 12:18 @554

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

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

Este programa nos lo cambia a UTF8:
Sintáxis: [ Descargar ] [ Ocultar ]
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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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

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

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

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


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


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
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. binmode $UCS2;
  2. binmode $UTF8;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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 & 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: Problemas al convertir UCS-2

Notapor Dgrande » 2010-02-05 04:24 @225

Gracias por todo.
Un saludo.
Dgrande
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-02-03 04:59 @249


Volver a Avanzado

¿Quién está conectado?

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