Автоматическое определение кодировки терминала в 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 — портал о фрилансе.



Category Рубрики: Кодинг, Новости | Tag Метки: , , , , , | Comments 4 комментария »

4 комментария

  1. Андрей says:

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

    • Dimio says:

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

  2. Антон says:

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

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

    • dimio says:

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

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