Как я могу рассматривать параметры командной строки как UTF-8 в Perl?

Как я рассматриваю элементы @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.

17
задан brian d foy 10 January 2010 в 16:00
поделиться

3 ответа

Внешние источники данных сложно в 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

Я нахожу «если вы знаете, «Быть ​​большим красным флагом, который действительно означает« мы не уверены », однако.

29
ответ дан 30 November 2019 в 11:17
поделиться

Вам не должно делать что-то особенное на строку. Струны 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. (не проверено).

4
ответ дан 30 November 2019 в 11:17
поделиться

Вы не должны делать ничего особенного со строкой. Строки 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
0
ответ дан 30 November 2019 в 11:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: