Perl non era originariamente compatibile con Unicode, e lavorare con UTF-8 richiede indicazioni esplicite. Perl moderno sa memorizzare le stringhe come astrazioni interne (scalari contrassegnati da utf8), ma le operazioni di input/output richiedono particolare attenzione.
binmode, :encoding(UTF-8)).use utf8; nel codice sorgente se contiene letterali in 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); # Otteniamo i byte my $string = decode('UTF-8', $bytes); # Otteniamo la stringa
È sufficiente aggiungere
use utf8;all'inizio dello script, affinché tutte le operazioni di input/output avvengano in UTF-8?
Risposta: No! La direttiva use utf8; serve solo per interpretare i letterali Unicode nel sorgente. Per input/output è necessario impostare i layer IO durante open o tramite binmode/open pragma! Ad esempio:
binmode STDOUT, ':encoding(UTF-8)'; open my $fh, '>:encoding(UTF-8)', $filename;
Storia
Storia
Storia
Durante l'integrazione del servizio Perl con il client MySQL si ignorava l'impostazione del client su utf8, lavorando con stringhe byte. All'interfaccia web si presentarono difetti: parte dei caratteri si presentava rotta, alcune query "spezzavano" la struttura dei dati. Ha aiutato una riconversione esplicita tramite Encode e l'impostazione 'mysql_enable_utf8'.