Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Как включить(подвязать) отображение русских букв?


Автор: Redee 26.12.2010, 23:14
Как включить(подвязать) отображение русских букв в Perl в командной строке виндовс?
При запуске программы Perl, установлен ActivePerl (команд. строка виндовс -- пуск - выполнить - cmd) место русских символов выдает иероглифы, вот исходник >>>

Код

#!/usr/bin/perl -w

print "Величина месячного взноса?";
$pmt=<STDIN>;
chomp $pmt;

print "Годовая процентная ставка? (пример 7% - 0.07)";
$interest=<STDIN>;
chomp $interest;

print "Период депозита в месяцах?";
$mons=<STDIN>;
chomp $mons;

# В формуле заложена месячная процентная ставка
$interest/=12;

$total=$pmt*((1+$interest)**($mons-1))/$interest;

print "После $mons месяцев при ежемесячной ставке $interest\n";
print "у вас будет сумма $total.\n";

Вот наглядно что выходит>>>
user posted image

З.Ы. Я полный профан, только начал изучать, объясните пожалуйста поподробнее.

Автор: shamber 27.12.2010, 09:41
попробуйте поискать по форуму
например http://forum.vingrad.ru/index.php?showtopic=139072&view=findpost&p=1050192

Автор: steyraug 27.12.2010, 13:07
use encoding "ru_RU.CP1251";

или

system('chcp 1251')

Автор: Redee 27.12.2010, 19:28
Огромное спасибо shamber и nitr  smile smile
Код преобразовался вот в что >>>
Код
#!/usr/bin/perl -w
use Encode qw(encode decode);
$content = "Величина месячного взноса?";
$content = Encode::encode('cp866', Encode::decode('cp1251', $content));
print $content;
$pmt=<STDIN>;
chomp $pmt;

$content = "Годовая процентная ставка? (пример 7% - 0.07)";
$content = Encode::encode('cp866', Encode::decode('cp1251', $content));
print $content;
$interest=<STDIN>;
chomp $interest;

$content = "Период депозита в месяцах?";
$content = Encode::encode('cp866', Encode::decode('cp1251', $content));
print $content;
$mons=<STDIN>;
chomp $mons;

# В формуле заложена месячная процентная ставка
$interest/=12;

$total=$pmt*((1+$interest)**($mons-1))/$interest;

$content = "После";
$content = Encode::encode('cp866', Encode::decode('cp1251', $content));
$content2 = "месяцев при ежемесячной ставке";
$content2 = Encode::encode('cp866', Encode::decode('cp1251', $content2));
print "$content $mons $content2 $interest\n";

$content = "У вас будет сумма";
$content = Encode::encode('cp866', Encode::decode('cp1251', $content));
print "$content $total.\n";

Но остались вопросы...
Если я не знаю кодировку командной строки виндовс или другого средства вывода(проверки) программы, как мне ее узнать ведь в этом действенном методе обязательно надо знать в каком формате предыдущая и на какую кодировать ('cp866' и 'cp1251').
Код

$content = Encode::encode('cp866', Encode::decode('cp1251', $content));

И еще сам код программы разростается до невообразимых размеров если это длинная прога, есть ли метод задания этих двух кодировок ???
То есть чтобы одновременно работало и 'cp866' и 'cp1251'. Или как то так чтобы где вывод текста русс. буквами автоматически отслеживались и обрабатывалось в 'cp1251'.

Автор: shamber 2.1.2011, 18:51
Цитата(Redee @  27.12.2010,  19:28 Найти цитируемый пост)
И еще сам код программы разростается до невообразимых размеров если это длинная прога, есть ли метод задания этих двух кодировок ???

вынесите код в попрограмму
например так:
Код

#!/usr/bin/perl -w
use Encode qw(encode decode);

print_enc("Величина месячного взноса?");

sub print_enc{
    my $text = shift; #получили текст
    my $from = shift||"cp1251"; #если нужно указали другую кодировку или по умолчанию
    my $to = shift||"cp866"; #если нужно указали другую кодировку или по умолчанию
    $text = Encode::encode($to, Encode::decode($from, $text));
    print $text;
}


Добавлено через 1 минуту и 17 секунд
Цитата(Redee @  27.12.2010,  19:28 Найти цитируемый пост)
Или как то так чтобы где вывод текста русс. буквами автоматически отслеживались и обрабатывалось в 'cp1251'.

чего-то я не пойму как вы собираетесь отслеживать это.

Автор: Redee 5.1.2011, 00:24
shamber благодарствую, с наступающим Рождеством, очень упростили мне жизнь  smile  smile 
Теперь с помощью print_enc код программы заметно легче ))) >>>
Код

#!/usr/bin/perl -w
use Encode qw(encode decode);

sub print_enc {
    my $text = shift; # получили текст
    my $from = shift||"cp1251"; # если нужно указали другую кодировку или по умолчанию
    my $to = shift||"cp866"; # если нужно указали другую кодировку или по умолчанию
    $text = Encode::encode($to, Encode::decode($from, $text));
    print $text;
}

print_enc "Величина месячного взноса?";
$pmt=<STDIN>;
chomp $pmt;

print_enc "Годовая процентная ставка? (пример 7% - 0.07)";
$interest=<STDIN>;
chomp $interest;

print_enc "Период депозита в месяцах?";
$mons=<STDIN>;
chomp $mons;

# В формуле заложена месячная процентная ставка
$interest/=12;

$total=$pmt*((1+$interest)**($mons-1))/$interest;

print_enc "После $mons месяцев при ежемесячной ставке $interest
у вас будет сумма $total.\n";

Автор: shamber 5.1.2011, 13:14
Redee, и Вас с Рождеством.

вы лучше скобочки добавьте, так будет более читаемо, имхо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)