Sans use utf8
Perl interprète votre chaîne comme une séquence de caractères à un octet. Il y a quatre octets dans votre chaîne comme vous pouvez le voir:
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
Les trois premiers octets composent votre caractère, le dernier est le saut de ligne.
L'appel à print
envoie ces quatre caractères à STDOUT. Votre console détermine ensuite comment afficher ces caractères. Si votre console est configurée pour utiliser UTF8, elle interprétera ces trois octets comme votre caractère unique et c'est ce qui s'affiche.
Si nous ajoutons dans le utf8
module, les choses sont différentes. Dans ce cas, Perl interprète votre chaîne comme seulement deux caractères.
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
Par défaut, la couche IO de Perl suppose qu'elle fonctionne avec des caractères à un octet. Ainsi, lorsque vous essayez d'imprimer un caractère multi-octets, Perl pense que quelque chose ne va pas et vous avertit. Comme toujours, vous pouvez obtenir plus d'explications sur cette erreur en incluant use diagnostics
. Il dira ceci:
(S utf8) Perl rencontrait un caractère large (> 255) alors qu'il n'en attendait pas. Cet avertissement est activé par défaut pour les E / S (comme l'impression). Le moyen le plus simple de calmer cet avertissement est simplement d'ajouter la couche: utf8 à la sortie, par exemple binmode STDOUT, ': utf8'. Une autre façon de désactiver l'avertissement est de n'ajouter aucun avertissement «utf8»; mais c'est souvent plus proche de la triche. En général, vous êtes censé marquer explicitement le descripteur de fichier avec un encodage, voir open et perlfunc / binmode.
Comme d'autres l'ont souligné, vous devez dire à Perl d'accepter la sortie multi-octets. Il existe de nombreuses façons de procéder (voir le didacticiel Perl Unicode pour quelques exemples). L'un des moyens les plus simples est d'utiliser l' -CS
indicateur de ligne de commande - qui indique aux trois descripteurs de fichier standard (STDIN, STDOUT et STDERR) de gérer UTF8.
$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡
contre
$ perl -Mutf8 -CS -e 'print "鸡\n";'
鸡
Unicode est un domaine vaste et complexe. Comme vous l'avez vu, de nombreux programmes simples semblent faire la bonne chose, mais pour les mauvaises raisons. Lorsque vous commencez à réparer une partie du programme, les choses empirent souvent jusqu'à ce que vous ayez réparé tout le programme.