Perl n'a pas été initialement conçu pour être convivial avec Unicode, et le travail avec UTF-8 nécessite des indications explicites. Perl moderne peut stocker des chaînes comme des abstractions internes (scalaires marqués utf8), mais les opérations d'entrée/sortie nécessitent une attention particulière.
binmode, :encoding(UTF-8)).use utf8; dans le code source s'il contient des littéraux 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); # Obtenez des octets my $string = decode('UTF-8', $bytes); # Obtenez une chaîne
Est-il suffisant d'ajouter
use utf8;au début du script pour que toutes les opérations d'entrée/sortie se fassent en UTF-8 ?
Réponse : Non ! La directive use utf8; interprète uniquement les littéraux Unicode dans le code source. Pour l'entrée/sortie, il est nécessaire de définir les couches IO lors de l'ouverture ou via binmode/open pragma ! Par exemple :
binmode STDOUT, ':encoding(UTF-8)'; open my $fh, '>:encoding(UTF-8)', $filename;
Historique
Historique
Historique
Lors de l'intégration d'un service Perl avec un client MySQL, la configuration du client en utf8 a été ignorée, travaillant avec des chaînes d'octets. À l'interface web, des défauts sont apparus — certains caractères étaient déformés, certaines requêtes "cassaient" la structure des données. Une conversion explicite via Encode et la configuration 'mysql_enable_utf8' ont aidé.