Автоматическое определение кодировки терминала в perl-скрипте.

Надоело руками менять кодировки для нормального вывода русского текста в своих 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 — портал о фрилансе.

4 мысли о “Автоматическое определение кодировки терминала в perl-скрипте.”

  1. Нет. Это так себе вариант. Только если для себя. У меня например для серверов AIX используются MobaXTerm и SSH Secure Shell. Первый работает в utf, второй в cp1251. ОС одна. Нужно другое решение.

    1. Конечно «для себя», так и написано в заметке. Хотя cygwin ведь не ОС, а среда. Т.е. может и мое решение подойти, если ваши среды себя как-то отлично друг от друга и от ОС идентифицируют.
      Кроме того — с 2009 года наверняка уже готовые модули появились для решения этой проблемы.

  2. В одной и той же ОС разные пользователи могут использовать кодировку. Так что лучше смотреть на локаль.

    В простейшем случае единственное что нужно добавить в скрипт:
    use utf8;
    use open ‘:locale’;

    1. Резонно, благодарю.
      ЕМНИП, в 5.8.8 (которая у меня на хостинге) баг был какой-то с этим делом, который в 5.8.9 исправили, отчего и забыл про такую возможность.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *