Perl z początku nie był przyjazny dla Unicode, a praca z UTF-8 wymaga wyraźnych wskazówek. Nowoczesny Perl potrafi przechowywać ciągi jako wewnętrzne abstrakcje (skalary z flagą utf8), ale operacje wejścia-wyjścia wymagają szczególnej uwagi.
binmode, :encoding(UTF-8)).use utf8; w kodzie źródłowym, jeśli zawiera literały w 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); # Otrzymujemy bajty my $string = decode('UTF-8', $bytes); # Otrzymujemy ciąg
Czy wystarczy dodać
use utf8;na początku skryptu, aby wszystkie operacje wejścia-wyjścia odbywały się w UTF-8?
Odpowiedź: Nie! Dyrektywa use utf8; tylko interpretuje literały Unicode w kodzie źródłowym. Dla wejścia-wyjścia należy ustawić warstwy IO przy open lub przez binmode/open pragma! Na przykład:
binmode STDOUT, ':encoding(UTF-8)'; open my $fh, '>:encoding(UTF-8)', $filename;
Historia
Historia
Historia
Podczas integracji usługi Perl z klientem MySQL ignorowano ustawienie klienta na utf8, pracując z bajtowymi ciągami. Na styku z web-interfejsem pojawiły się usterki — część znaków była złamana, część zapytań "łamała" strukturę danych. Pomogła wyraźna przekodowanie przez Encode i ustawienie 'mysql_enable_utf8'.