Внешние источники данных являются сложными в Perl. Для аргументов командной строки вы, вероятно, получаете их в виде кодировки, указанной в вашей локали. Не надейтесь, что ваш язык будет таким же, как у кого-то, кто может запустить вашу программу.
Вы должны выяснить, что же тогда конвертировать во внутренний формат Perl. К счастью, это не так сложно.
В модуле I18N :: Langinfo есть то, что нужно для получения кодировки:
use I18N::Langinfo qw(langinfo CODESET);
my $codeset = langinfo(CODESET);
Как только вы знаете кодировку, вы можете декодировать их в строки Perl:
use Encode qw(decode);
@ARGV = map { decode $codeset, $_ } @ARGV;
Хотя Perl кодирует внутренние строки как UTF-8, вы никогда не должны думать об этом или знать об этом. Вы просто декодируете все, что получаете, что превращает это во внутреннее представление Perl для вас. Поверьте, что Perl справится со всем остальным. Когда вам нужно сохранить данные, убедитесь, что вы используете нужную кодировку.
Если вы знаете, что ваша установка UTF-8, и терминал выдаст вам аргументы командной строки как UTF-8, вы можете использовать опцию A
с переключателем Perl -C
. Это говорит вашей программе, что аргументы должны быть закодированы как UTF-8:
% perl -CA program
Вы также получаете это только с -C
, который включает несколько других опций Unicode:
% perl -C program
Я нахожу "если вы знаете" большой красный флаг, который на самом деле означает "мы не уверены", однако.