Первый способ: Используем опцию -C интерпретатора perl.
/usr/bin/perl -CSDA - включает UTF-8 на всех интерфейсах и для всех данных поступающих в ARGV. /usr/bin/perl -CSDAL - то же самое, но только при условии, что UTF-8 - кодировка текущей локали.
Неудобно. На моём опыте perl часто ругался на указание этой опции в первой строке запускаемого файла.
Второй способ: Те же самые опции имеют свои числовые аналоги. Их можно указать в переменной окружения PERL_UNICODE. Используем числовые значения, для упомянутых выше комбинаций букв с опцией C (63 - для SDA, 127 для SDAL) PERL_UNICODE=63 включает UTF-8 на всех интерфейсах и для всех данных поступающих в ARGV. PERL_UNICODE=127 - то же самое, но только при условии, что UTF-8 - кодировка текущей локали.
Опять же, неудобно, на мой взгляд.
Третий способ: Попробуем всё же добиться этого же эффекта в рантайме.
Используем прагму open, для того, чтобы переключить интерфейсы ввода/вывода на UTF-8.
use open IO => ':utf8'; #Это аналогично: #use open ':utf8';
Сабпрагма :utf8 говорит perl о том, что входные и выходные данные представлены в UTF-8.
use open ':std';
Эта сабпрагма открывает STDIN, STDERR и STDOUT в выбраной кодировке (в случае с utf8, очевидно, включается так же binmode)
Кроме того, если кодировка локали UTF-8, то можно вместо двух предыдущих сабпрагм воспользоваться:
use open ':locale';
Эта сабпрагма определяет кодировку локали. Дальше выстовляется кодировка входных/выходных данных и открываются STDERR, STDIN и STDOUT в этой кодировке.
И последнее замечание для этого случая: данные в @ARGV по умолчанию пёрл ожидает в своей внутреней кодировке. Так что, для всех строк в @ARGV будет отключен utf8 флаг. Предлгается его всё же включить, например так:
BEGIN { require Encode;
foreach (@ARGV) { Encode::_utf8_on($_); } }
Cкрипт для примера мог бы выглядеть так:
#!/usr/bin/perl
use strict; use utf8; #Не забываем и про эту прагму. Она сообщает пёрлу о том, #что исходник написан в utf8
use open ':utf8'; use open ':std'; #или use open ':locale';
use Encode; foreach (@ARGV) { Encode::_utf8_on($_); }
my $argument = shift; #Первый аргумент из @ARGV print "ARGUMENT: ". ($argument || "None"). "\n"; print "Enter something in UTF-8: "; my $stdin = join('', ); #Получаем данные из STDIN print "You entered: ". $stdin. "\n"; #Ну и похардкодим что-нибудь до кучи print "Hardcoded data: \n"; print "\x{263A}\n"; #Смайлик:) print "\x{b2}\n"; #Степень двойки
UTF-8 и CGI.pm: Если вы используете модуль CGI.pm, то данные полученные через CGI (не важно POST или GET метод исползовался) CGI.pm вернёт вам данные в кодировке iso-8859-1. Исправляется одной строчкой:
my $param = $cgi->param('test'); $param = Encode::decode_utf8($param); #Теперь всё в порядке