Надоело руками менять кодировки для нормального вывода русского текста в своих perl-скриптах в зависимости от кодировки терминала (запускаю скрипты под Linux (utf8), Windows (ActivePerl, cp866) и Windows (Cygwin, cp1251)). Немного погуглил, но никаких готовых рецептов не встретил, хороший запрос для поиска что-то в голову не пришёл.
Решил поступить следующим образом — определять операционную систему, в которой запущен скрипт, и в зависимости от этого выставлять кодировку выходного потока (STDOUT):
#!/usr/bin/perl;
use utf8;
require encoding;
import encoding ('utf8', 'STDOUT' => &SetEncoding);
sub SetEncoding {
if ($^O =~ /^MSWin\d{2}$/i) {
return 'cp866';
}
elsif ($^O =~ /^cygwin$/i) {
return 'cp1251';
}
elsif ( условие для следующей ОС (например - linux) ) {
return 'utf8';
}
# и так далее, исходя из личных потребностей
}
Замечания, исправления, дополнения и/или другие способы решения задачи по автоматической установке кодировки для perl-скрипта всегда приветствуются!
И на всякий случай, если вдруг мне не удастся найти время написать ещё что-то в блог до нового года — поздравляю всех своих читателей с наступающим новым годом, успехов вам и побольше приятных открытий! 🙂
PS: А для интересующихся фрилансом — новый, но достаточно любопытный ресурс ФрилансFM — портал о фрилансе.
Нет. Это так себе вариант. Только если для себя. У меня например для серверов AIX используются MobaXTerm и SSH Secure Shell. Первый работает в utf, второй в cp1251. ОС одна. Нужно другое решение.
Конечно «для себя», так и написано в заметке. Хотя cygwin ведь не ОС, а среда. Т.е. может и мое решение подойти, если ваши среды себя как-то отлично друг от друга и от ОС идентифицируют.
Кроме того — с 2009 года наверняка уже готовые модули появились для решения этой проблемы.
В одной и той же ОС разные пользователи могут использовать кодировку. Так что лучше смотреть на локаль.
В простейшем случае единственное что нужно добавить в скрипт:
use utf8;
use open ‘:locale’;
Резонно, благодарю.
ЕМНИП, в 5.8.8 (которая у меня на хостинге) баг был какой-то с этим делом, который в 5.8.9 исправили, отчего и забыл про такую возможность.