Как я рассматриваю элементы @ARGV
как UTF-8 в Perl?
В настоящее время я использую следующее обходное решение..
use Encode qw(decode encode);
my $foo = $ARGV[0];
$foo = decode("utf-8", $foo);
.. который работает, но не очень изящен.
Я использую Perl v5.8.8, который называют от удара v3.2.25 с набором ЛЕНГА к en_US.UTF-8.
Внешние источники данных сложно в Perl. Для аргументов командной строки вы, вероятно, получаете их как кодирование, указанную в вашей локали. Не полагайтесь на свою локаль, чтобы быть таким же, как кто-то еще, кто может управлять вашей программой.
Вы должны узнать, что то, что затем преобразуется в внутренний формат Perl. К счастью, это не так сложно.
Модуль I18N :: Langinfo Module имеет необходимое для получения кодирования:
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
Я нахожу «если вы знаете, «Быть большим красным флагом, который действительно означает« мы не уверены », однако.
Вам не должно делать что-то особенное на строку. Струны Perl находятся в UTF-8 по умолчанию, начиная с Perl 5.8.
perl -CO -le 'print "\x{2603}"' | xargs perl -le 'print "I saw @ARGV"'
Код выше работает нормально на Ubuntu 9.04, OS X 10.6, и FreeBSD 7.
FallebsiLShrub поднимает хорошую точку, мы можем увидеть определенную разницу между
perl -Mutf8 -wle ';print utf8::is_utf8($ARGV[0]) ? "t" : "f"' a
и
perl -Mutf8 -CA -wle ';print utf8::is_utf8($ARGV[0]) ? "t" : "f"' a
-121--2307582- Как вы сделали, кажется правильным. Это то, что я бы сделал.
Однако эта страница Perldoc предполагает, что флаг командной строки -CA
должен сказать ему лечить @ARGV
как UTF-8. (не проверено).
Вы не должны делать ничего особенного со строкой. Строки Perl по умолчанию находятся в UTF-8, начиная с Perl 5.8.
perl -CO -le 'print "\x{2603}"' | xargs perl -le 'print "I saw @ARGV"'
Приведенный выше код отлично работает в Ubuntu 9.04, OS X 10.6 и FreeBSD 7.
FalseVinylShrub поднимает хороший момент: мы можем видеть определенную разницу между
perl -Mutf8 -wle ';print utf8::is_utf8($ARGV[0]) ? "t" : "f"' a
и
perl -Mutf8 -CA -wle ';print utf8::is_utf8($ARGV[0]) ? "t" : "f"' a