Bez use utf8
Perla interpretuje twój ciąg jako sekwencję znaków jednobajtowych. Twój ciąg zawiera cztery bajty, jak widać z tego:
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
Pierwsze trzy bajty tworzą twoją postać, ostatni to przesunięcie o linię.
Wywołanie print
wysyła te cztery znaki do STDOUT. Twoja konsola ustali, jak wyświetlić te znaki. Jeśli twoja konsola jest ustawiona na używanie UTF8, to zinterpretuje te trzy bajty jako twój pojedynczy znak i to jest to, co jest wyświetlane.
Jeśli dodamy do utf8
modułu, sprawy mają się inaczej. W tym przypadku Perl interpretuje twój ciąg jako tylko dwa znaki.
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
Domyślnie warstwa IO Perla zakłada, że pracuje ze znakami jednobajtowymi. Więc kiedy próbujesz wydrukować znak wielobajtowy, Perl myśli, że coś jest nie tak i wyświetla ostrzeżenie. Jak zawsze, możesz uzyskać więcej wyjaśnienia tego błędu, dołączając use diagnostics
. Powie to:
(S utf8) Perl napotkał szeroki znak (> 255), kiedy go nie oczekiwał. To ostrzeżenie jest domyślnie włączone dla I / O (jak drukowanie). Najłatwiejszym sposobem wyciszenia tego ostrzeżenia jest po prostu dodanie warstwy: utf8 do wyjścia, np. Binmode STDOUT, ': utf8'. Innym sposobem na wyłączenie ostrzeżenia jest dodanie żadnych ostrzeżeń „utf8”; ale to często jest bliższe oszukiwaniu. Ogólnie rzecz biorąc, powinieneś jawnie oznaczyć uchwyt pliku za pomocą kodowania, zobacz open i perlfunc / binmode.
Jak zauważyli inni, musisz powiedzieć Perlowi, aby akceptował wielobajtowe wyjście. Można to zrobić na wiele sposobów ( kilka przykładów można znaleźć w samouczku Perl Unicode ). Jednym z najprostszych sposobów jest użycie -CS
flagi wiersza poleceń - która mówi trzem standardowym uchwytom plików (STDIN, STDOUT i STDERR), aby poradziły sobie z UTF8.
$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡
vs
$ perl -Mutf8 -CS -e 'print "鸡\n";'
鸡
Unicode to duży i złożony obszar. Jak widzieliście, wiele prostych programów wydaje się działać właściwie, ale z niewłaściwych powodów. Kiedy zaczynasz naprawiać część programu, sytuacja często się pogarsza, dopóki nie naprawisz całego programu.