Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кириллица как аргумент из консоли 
V
    Опции темы
sklins
Дата 27.9.2012, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.9.2012

Репутация: нет
Всего: нет



Как принять в качестве аргументов кириллицу из консоли? То есть я принимаю, но такое чувство что либо ошибка в кодировке, либо дописываются какие то невидимые символы. 
Код

....
use utf8;
use encoding 'utf8', STDOUT => 'cp866';

chop( my $arg = <STDIN>); #чомп-чомп-чомп! пол дня отладки, из-за символа конца строки!
#$arg = "дрон";
my $string = SecondTask::check($arg);
if ($string eq "true") {
        print "success";
    } else {
        print "Error"
}

Если расскоментировать строчку, где написано "дрон", то проверка проходит. Если $arg принимает аргумент тот же самый (дрон) из консоли, то проверка не проходит.
PM MAIL   Вверх
vadiml
Дата 27.9.2012, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



Я бы считывал строку как есть, а перекодирывал используя модуль Encode.

PM MAIL Jabber   Вверх
Logo
Дата 27.9.2012, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Код

binmode STDIN, ':encoding(cp886)';

#или
use encoding 'utf8', STDOUT => 'cp866', STDIN => 'cp866';
#или
use Encode::StdIO  encoding => 'cp866'; #установить кодировку STDOUT, STDIN, STDERR
use Encode::StdIO; # Установить кодировку в соответствии с настройками терминала, определяя ее через Term::Encoding

Вероятно вам еще нужно установить кодировку STDERR для вывода предупреждений и диагностических сообщений.

Аргументы командной строки, настоящие, те которые передаются скрипту вот так
Код

perl script.pl ARG1 ARG2 ARG3

Нужно будет все равно перекодировать с помощью модуля Encode. Либо использовать модуль Encode::Argv.
Код

use Encode::Argv encoding => 'cp866';
use Encode::Argv;  # по настройкам терминала


Это сообщение отредактировал(а) Logo - 27.9.2012, 22:36
PM MAIL   Вверх
sklins
Дата 28.9.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.9.2012

Репутация: нет
Всего: нет



Беда оказалась в том, что скрипт считал, что из консоли приходит аргумент в koi8-r. Хотя на самом деле в консоли кодировка cp866. Решилось так
Код

my $arg = decode ('cp866', $arg);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4045 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.