A ver... no es tan simple...
¿Cuál es el proceso que realizas? ¿Lees de un fichero y escribes a otro? Entonces... ¿en qué está codificado el archivo de entrada? ¿en qué codificación debe estar la salida?
Si usas XML, ya sabes que la codificación por defecto de este tipo de archivos es UTF-8, así que hay que suponer que esa es la codificación de entrada, y suponemos también que esa es la codificación de salida.
En el caso que comentas, parece que el carácter que no se ve es una 'Ñ', codificada en UTF-8. ¿Qué es lo que quieres hacer con ese texto? Guardarlo en otro sitio, pero, ¿en qué codificación?
Lo que tienes es esto:
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use Encode;
my $string = "<Tag>DISE\xC3\x91OS</Tag>"; # Una ristra de *bytes*
my $octets = decode_utf8($string); # De esa ristra, la decodificamos como si estuviera en UTF-8, y
# la almacenamos como una ristra de *caracteres*,
# en el _formato interno de Perl_
binmode STDOUT, ':encoding(utf-8)'; # solicitamos que la salida por STDOUT debe ir codificado en UTF-8
say $octets; # Perl toma la ristra de *caracteres* (en formato Perl),
# y lo saca en codificación UTF-8
__END__
<Tag>DISEÑOS</Tag>
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Observa: no es lo mismo hablar de una ristra de bytes, que una ristra de caracteres. Con Encode podemos pasar de una codificación a otra o, como en este caso, pasamos de un formato conocido por nosotros (y no por Perl), al formato
interno que usa Perl para almacenar caracteres. Una vez que lo tenemos, podemos hacer las cosas normales que hacemos con las operaciones de caracteres. Finalmente, en el momento de la salida de datos, tenemos que indicar en qué codificación debe ser la salida, ya que por defecto, Perl lo hace en codificación ISO-8859-1. Si la salida debe ser en UTF-8 (bien sea porque nuestra terminal de línea de comandos o el archivo donde estamos escribiendo están en esa codificación), entonces lo cambiamos con un binmode(), indicando la capa de E/S que Perl debe usar para hacer la conversión entre el formato interno.
Ahora bien... supongamos que tanto la entrada y la salida están en formato UTF-8, y que esa entrada y salida son (por simplificar también), las correspondientes a las estándares. Entonces, el programa queda muy simple:
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use open qw(:utf8 :std); # Entradas y salidas estándar, en modo utf8
use File::Slurp; # Leer y escribir archivos
my $cadena = read_file('kk.txt', binmode => ':utf8'); # Leemos el archivo, codificado en utf8
# ... aquí jugamos con la $cadena
say $cadena; # La salida ya sabemos que va en UTF-8
__END__
<Tag>DISEÑOS</Tag>
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Así que primero tenemos que saber en qué codificaciones tienes que trabajar... :)
A partir de Perl v5.12, y sobretodo a partir de Perl v5.14, todas las operaciones de cadenas usan semántica de caracteres (dentro del ámbito de la
feature 'unicode_strings', que facilita mucho el trabajo con varias codificaciones, pero centrándose siempre en UTF-8).