• Publicidad

Otra vez problemas con la codificación de ficheros

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

Otra vez problemas con la codificación de ficheros

Notapor ddiana » 2010-02-15 15:22 @682

Hola, de nuevo estoy aquí con problemas con la codificación de los archivos.

Necesito guardar un fichero que modifiqué con codificación unicode, pero cuando lo hago, queda almacenado con codificación ansi. Con el mismo código, guardé el archivo con codificación utf8 y ésta sí me la respetó.

Podrían decirme qué es lo que está pasando y cómo puedo guardar el archivo con una codificación unicode.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Encode qw(from_to);

# me guarda unicode.txt con codificación ansi
open my $FILE,  '<', 'D:\ansi.txt';
open my $COPIA, '>', 'D:\unicode' or die "ERROR: $!\n";
read $FILE, my $buffer, -s 'D:\ansi.txt';
from_to($buffer,'cp1252','ucs-2le');
print $COPIA $buffer;
close $FILE;
close $COPIA;

# me guarda unicode.txt con codificación utf8
open my $FILE,  '<', 'D:\ansi.txt';
open my $COPIA, '>', 'D:\unicode' or die "ERROR: $!\n";
read $FILE, my $buffer, -s 'D:\ansi.txt';
from_to($buffer,'cp1252','utf8');
print $COPIA $buffer;
close $FILE;
close $COPIA;
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Gracias, tal vez sea algo muy sencillo pero me ha costado trabajo y espero que puedan ayudarme.
ddiana
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2010-02-08 13:26 @601

Publicidad

Re: Otra vez problemas con la codificación de ficheros

Notapor explorer » 2010-02-15 16:15 @718

Debes aclararte algo antes: cuando dices unicode estás hablando de un estándar de codificación, pero no de una codificación en concreto.

Dentro de Unicode hay varios tipos de codificación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
UTF-8
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que tu llamas unicode, en realidad es una de las codificaciones de utf-16.

Y lo que llamas ANSI es lo que Microsoft llama a su codificación del alfabeto latino, que es mucho mejor llamarlo Windows-1252 para evitar confundirlo con otros términos ANSI.

Por favor, lee los hilos anteriores donde hemos tratado este tema, sobre en la parte que dice que Perl tiene una codificación, por defecto, para la lectura y escritura de los ficheros, que es justo lo que te pasa.

* Problemas al convertir UCS-2

* Nombres de ficheros con caracteres latinos en Windows

Luego, si después no consigues resolver el problema, pues nos mandas otro mensaje, y vemos el problema con más detalle.
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: Otra vez problemas con la codificación de ficheros

Notapor ddiana » 2010-02-17 16:28 @728

Hola:
Ya estuve leyendo lo que me recomendaron pero no he logrado hacer lo que necesito ya que si abro el fichero donde copié la información con el bloc de notas, puedo ver que en codificación dice ANSI y lo que necesito que diga es UNICODE. Además, cuando copio el contenido de un fichero a otro cambiando la codificación de cp1252 a ucs-2le (como en el código que anexé en mi primer mensaje), sí aparece toda la información pero entre una letra y otra aparece un espacio en blanco. ¡¡Muchas gracias!!
ddiana
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2010-02-08 13:26 @601

Re: Otra vez problemas con la codificación de ficheros

Notapor explorer » 2010-02-17 18:13 @800

No es un espacio lo que aparece entre cada letra. Es un byte 0. Es porque está codificado en UCS-2LE.

Y te vuelvo a decir que no nos has dicho en que codificación quieres grabar el fichero. Si quieres grabarlo como UCS-2LE, entonces es correcto lo que estás haciendo, salvo que la salida es afectada por la codificación propia de Perl, en la salida. Pero en lugar de usar from_to(), yo usaría el pragma open.

Además, es de suponer que si es Perl en Windows, la codificación por defecto ya la lee en formato cp1252 (no lo sé, porque yo no uso Windows). Solo quedaría por definir el formato de salida. Sería algo así (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use open IN  => ":encoding(cp1252)", OUT => ":encoding(ucs-2le)";
open my $FILE,  '<', 'D:\ansi.txt';
open my $COPIA, '>', 'D:\unicode' or die "ERROR: $!\n";
read $FILE, my $buffer, -s 'D:\ansi.txt';  # leemos en cp1252
                                           # en este punto, $buffer está codificado en latin1
print $COPIA $buffer;                      # escribimos en ucs-2le
close $FILE;
close $COPIA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Repito que no sé si funcionará, ya que no lo puedo probar.
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: Otra vez problemas con la codificación de ficheros

Notapor ddiana » 2010-02-18 13:08 @589

OK, muchas gracias, voy a probarlo a ver qué pasa.
ddiana
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2010-02-08 13:26 @601

Re: Otra vez problemas con la codificación de ficheros

Notapor ddiana » 2010-02-19 15:44 @697

Hola de nuevo, ya probé el código anterior y otra vez me guarda la información con codificación cp1252 y 3 bits de más entre cada letra. ¿Alguna otra idea?
ddiana
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2010-02-08 13:26 @601

Re: Otra vez problemas con la codificación de ficheros

Notapor explorer » 2010-02-19 19:33 @856

¿Y cómo sabes que son 3 bits? ¿Puedes volcar una salida hexadecimal, de prueba, de la salida del programa?
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: Otra vez problemas con la codificación de ficheros

Notapor ddiana » 2010-02-23 12:44 @572

Hola:
En realidad no estoy segura de que sean 3 bytes, pero entre letra y letra hay 3 espacios. Ya mandé a imprimir un número hexadecimal y a este número sólo le pone un espacio en vez de tres entre cada carácter.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#código
use open IN  => ":encoding(cp1252)", OUT => ":encoding(ucs-2le)";
open my $FILE,  '<', 'D:\Documents and Settings\ansi.txt';
open my $COPIA, '>', 'D:\Documents and Settings\copia.txt' or die "ERROR: $!\n";
read $FILE, my $buffer, -s 'D:\Documents and Settings\ansi.txt';
print $COPIA $buffer;                      
close $FILE;
$num=44;
printf($COPIA "%x", $num);
close $COPIA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ejemplo del archivo copia.txt
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 V   o   i   c   e       D   i   a   l   i   n   g       H   e   l   p       C   o   u   n   t   e   r   =   1  
   
   P   e   r   s   o   n   a   l   i   z   e   d       R   i   n   g       M   e   n   u   =   0  
   
   D   i   s   p   l   a   y       L   a   n   g   u   a   g   e   =   E   s   p   a   ñ   o   l       L   A  
   
   V   o   i   c   e       I   n   i   t   i   a   t   e   d       D   i   a   l   i   n   g       L   a   n   g   u   a   g   e   =  
   
   2 c
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
ddiana
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2010-02-08 13:26 @601

Re: Otra vez problemas con la codificación de ficheros

Notapor explorer » 2010-02-23 17:37 @775

A ver... cuando yo te digo que necesitamos ver una salida en hexadecimal, me refiero a ver algo como esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> hexdump -C ucs2.txt
00000000  45 73 74 6f 20 65 73 20  75 6e 61 20 70 72 75 65  |Esto es una prue|
00000010  62 61 20 64 65 20 75 63  73 32 2e 20 e1 e9 ed f3  |ba de ucs2. ....|
00000020  fa f1 d1 0a                                       |....|
00000024
explorer@casa:~/Documents/Desarrollo> hexdump -C utf8.txt
00000000  45 73 74 6f 20 65 73 20  75 6e 61 20 70 72 75 65  |Esto es una prue|
00000010  62 61 20 64 65 20 75 63  73 32 2e 20 c3 a1 c3 a9  |ba de ucs2. ....|
00000020  c3 ad c3 b3 c3 ba c3 b1  c3 91 0a                 |...........|
0000002b
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Si no, no sabremos de qué estamos hablando.

Y no es lo mismo bytes que bits.

Yo no creo que sean espacios lo que estás viendo, sino bytes 0, pero claro, no lo sabemos.

Yo he hecho una prueba. Dado el fichero 1252.txt:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> hexdump -C 1252.txt
00000000  50 72 75 65 62 61 3a 5b  e1 e9 ed f3 fa f1 d1 5d  |Prueba:[.......]|
00000010  0a                                                |.|
00000011
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
que visualmente es: Prueba:[áéíóúñÑ]. Codificado un byte por carácter, muy similar a la iso-8859-1.

Luego, con el programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use open IN  => ":encoding(cp1252)", OUT => ":encoding(ucs-2le)";

my $entrada_fichero = '1252.txt';
my $salida_fichero  = 'ucs2.txt';


open my $FILE,  '<', $entrada_fichero;
open my $COPIA, '>', $salida_fichero or die "ERROR: $!\n";

read $FILE, my $buffer, -s $entrada_fichero;

print $COPIA $buffer;

close $FILE;
close $COPIA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

sale el fichero ucs2.txt:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> hexdump -C ucs2.txt
00000000  50 00 72 00 75 00 65 00  62 00 61 00 3a 00 5b 00  |P.r.u.e.b.a.:.[.|
00000010  e1 00 e9 00 ed 00 f3 00  fa 00 f1 00 d1 00 5d 00  |..............].|
00000020  0a 00                                             |..|
00000022
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Como ves, la salida está en formato ucs-2le (16 bits por carácter).

Así que el programa tuyo, funciona, al menos, en mi ordenador (que, además, no es Windows).
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


Volver a Básico

¿Quién está conectado?

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