Aquí hay otra forma:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use feature "say";
#use utf8; # desactivado porque no hay utf8 en el código
use open IO => ":utf8"; # sí que vamos a leer en utf8
use open ":std"; # también la STDIN, STDOUT, STDERR están en utf8
open my $fh, "kk.txt"; # leemos todo el fichero en utf8
local $/;
my $f = <$fh>;
close $fh;
say join ",",
map {
sprintf 'U+%04X', # el valor entero que recibimos lo pasamos a hex
unpack 'U0U*' # cada carácter es desempaquetado como un carácter UTF-8
}
split //, $f # dividimos por caracteres
;
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:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use feature "say";
use File::Slurp;
open my $fh, "<:utf8", "kk.txt"; # leemos todo el fichero en utf8
my $f = read_file($fh);
close $fh;
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).