Perl no era originalmente amigable con Unicode, y trabajar con UTF-8 requiere indicaciones explícitas. Perl moderno puede almacenar cadenas como abstracciones internas (escalars con flag utf8), pero las operaciones de entrada/salida requieren atención especial.
binmode, :encoding(UTF-8)).use utf8; en el código fuente si contiene literales en Unicode.open my $fh, '<:encoding(UTF-8)', 'myfile.txt' or die $!; binmode STDOUT, ':encoding(UTF-8)';
Encode, utf8, open, charnames.use Encode; my $bytes = encode('UTF-8', $string); # Obtenemos bytes my $string = decode('UTF-8', $bytes); # Obtenemos cadena
¿Es suficiente agregar
use utf8;al principio del skripta para que todas las operaciones de entrada/salida se realicen en UTF-8?
Respuesta: ¡No! La directiva use utf8; solo interpreta literales Unicode en el fuente. Para entrada/salida, es necesario establecer capas IO en open o a través de binmode/open pragma! Por ejemplo:
binmode STDOUT, ':encoding(UTF-8)'; open my $fh, '>:encoding(UTF-8)', $filename;
Historia
Historia
Historia
Al integrar un servicio Perl con un cliente MySQL, se ignoró la configuración del cliente para utf8, se trabajó con cadenas de bytes. En la intersección con la interfaz web, aparecieron defectos: parte de los caracteres se mostraba rota, y algunas consultas "rompían" la estructura de datos. La conversión explícita a través de Encode y la configuración 'mysql_enable_utf8' ayudaron.