Perl изначально не был Unicode-friendly, и работа с UTF-8 требует явных указаний. Современный Perl умеет хранить строки как внутренние абстракции (utf8-flagged scalars), но операции ввода-вывода требуют особого внимания.
binmode, :encoding(UTF-8)).use utf8; в исходном коде, если он содержит литералы в 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); # Получаем байты my $string = decode('UTF-8', $bytes); # Получаем строку
Достаточно ли добавить
use utf8;в начало skripta, чтобы все операции ввода-вывода происходили в UTF-8?
Ответ: Нет! Директива use utf8; только интерпретирует Unicode-литералы в исходнике. Для ввода-вывода нужно выставлять слои IO при open или через binmode/open pragma! Например:
binmode STDOUT, ':encoding(UTF-8)'; open my $fh, '>:encoding(UTF-8)', $filename;
История
История
История
При интеграции Perl-сервиса с MySQL клиентом игнорировали настройку клиента на utf8, работали с байтовыми строками. На стыке с web-интерфейсом появились дефекты — часть символов шла сломанной, часть запросов "ломала" структуру данных. Помогла явная перекодировка через Encode и настройка 'mysql_enable_utf8'.