• Publicidad

Obtener el código unicode

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Obtener el código unicode

Notapor xagutxu » 2010-12-28 18:14 @801

Hola a todos:

He de obtener los códigos Unicode de todos los caracteres contenidos en un fichero que está en utf8 (o, en su defecto, el equivalente hexadecimal). ¿Alguien puede ayudarme?

Gracias,

Xagutxu
xagutxu
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-11-25 12:39 @569

Publicidad

Re: Obtener el código unicode

Notapor explorer » 2010-12-28 18:22 @807

Cuando te refieres a Unicode, ¿te estás refiriendo a UTF-32 o alguna otra codificación?
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: Obtener el código unicode

Notapor xagutxu » 2010-12-28 18:30 @813

El asunto es que tengo textos en varios idiomas (chino incluido) y he de obtener todos los caracteres que se utilizan en código Unicode (tipo: U+0020).

He estado probando con "decode" (obtengo los bytes en hex.) pero me da un error cuando utilizo caracteres de más de un byte...

¿Alguna idea?
xagutxu
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-11-25 12:39 @569

Re: Obtener el código unicode

Notapor explorer » 2010-12-28 19:36 @858

No sé si esto te servirá:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use feature "say";
  4. use File::Slurp;
  5. use Encode qw/from_to/;
  6.  
  7. my $f = read_file("kk.txt");
  8.  
  9. my $l = Encode::from_to($f, "utf8", "UTF-32");
  10.  
  11. say join ",", map { sprintf "U+%04X", $_ } unpack "N*", $f;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Dado el fichero de entrada
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[áéíóú]
[ÁÉÍÓÚ]
[ÑñÜüÇ]
[ⒶⒷⒸⒹ]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
obtenemos como salida

U+FEFF,U+005B,U+00E1,U+00E9,U+00ED,U+00F3,U+00FA,U+005D,U+000A,U+005B,U+00C1,U+00C9,U+00CD,U+00D3,
U+00DA,U+005D,U+000A,U+005B,U+00D1,U+00F1,U+00DC,U+00FC,U+00C7,U+005D,U+000A,U+005B,U+24B6,U+24B7,
U+24B8,U+24B9,U+005D,U+000A


El primer valor (U+FEFF) es el BOM, por lo que podrías descartarlo.
El "N*" del unpack() lo que hace es sacar todos los valores de 32 bits, big-endian, de $f. Luego, cada valor es pasado a sprintf() que lo formateará como queremos (4 dígitos hexadecimales rellenos con cero a la izquierda), para salir todo unido con comas.

Es posible que tengas que ampliar de 4 a 8.

Esta solución no me gusta, así que estoy mirando más.
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: Obtener el código unicode

Notapor explorer » 2010-12-28 20:44 @905

Aquí hay otra forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use feature "say";
  4. #use utf8;              # desactivado porque no hay utf8 en el código
  5.  
  6. use open IO => ":utf8"; # sí que vamos a leer en utf8
  7. use open ":std";        # también la STDIN, STDOUT, STDERR están en utf8
  8.  
  9. open my $fh, "kk.txt";  # leemos todo el fichero en utf8
  10. local $/;
  11. my $f = <$fh>;
  12. close $fh;
  13.  
  14. say join ",",
  15.     map {
  16.         sprintf 'U+%04X',       # el valor entero que recibimos lo pasamos a hex
  17.         unpack 'U0U*'           # cada carácter es desempaquetado como un carácter UTF-8
  18.     }
  19.     split //, $f                # dividimos por caracteres
  20.     ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aquí, usamos las capas del pragma open para indicar que lo que vamos a leer está en utf8. Perl lee el fichero y lo pasa a Unicode dentro de $f. Luego, dividimos $f por cada carácter. unpack() es necesario para transformar cada carácter Unicode en la representación interna de Perl, a un valor UTF-8 (estricto). El resultado de unpack() es el valor decimal de la representación en UTF-8. Lo pasamos a sprintf() para que lo formatee como hex de 4 dígitos relleno con ceros, y join() unirá todo con comas.

También lo podríamos hacer con ord() pero antes tendríamos que asegurarnos que el carácter tiene puesta la bandera utf8, cosa que podríamos hacer con Encode::_utf_on(), pero esta función no comprueba que el carácter sea un utf8 estricto (UTF-8), por lo que tendremos que hacer antes otra comprobación. Es mejor decodificar explícitamente el carácter como UTF-8, y luego pasarlo a ord():

ord Encode::decode("UTF-8", $char);

Con Perl más modernos (yo tengo el Perl v5.12.2), la representación interna de las cadenas es muy posible que sea UTF-8, por lo que se puede usar ord() directamente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use feature "say";
  4.  
  5. use File::Slurp;
  6.  
  7. open my $fh, "<:utf8", "kk.txt";  # leemos todo el fichero en utf8
  8. my $f = read_file($fh);
  9. close $fh;
  10.  
  11. say join ",", map { sprintf 'U+%04X', ord } split //, $f;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esto es posible porque $f es leído y almacenado en formato utf8 y porque ord() entiende el tamaño del carácter que le estamos pasando (no son bytes, son 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

Re: Obtener el código unicode

Notapor xagutxu » 2010-12-29 06:00 @292

Muchas gracias, Explorer, funciona a las mil maravillas. Es lo que quería.

Gracias otra vez,

Xagutxu
xagutxu
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-11-25 12:39 @569


Volver a Intermedio

¿Quién está conectado?

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

cron