LINUX.ORG.RU

Perl и кодировки


0

0

Доброго времени суток.

Обнаружил в своих знаниях perl огромную дыру в области работы с кодировками. Я знаю, как установить кодировку для дескриптора файла (binmode) и как перекодировать данные (encode из модуля Encode). Но вот чего я не понимаю, так это как установить кодировку для следующих источников данных:

1) вызов внешней программы через кавычки: `<команда>`

2) безымянный дескриптор, через который читается стандартный ввод и файлы, переданные в качестве парамаетров: while ( <> ) { <команды>; }

3) параметры командной строки

Ещё не понимаю, почему указание прагм

use utf8;
use locale

при локали utf8 не приводит к тому, что всё вышеперечисленное символьно-ориентировано, а не байт-ориентировано. Можно ли указать, что ВСЁ - символы, без исключений?


Такие дела :(
Если лень отвечать на ламерские вопросы - подскажите, пожалуйста, литературу.

★★★★★

use encoding 'utf8';
use Encode;

Локаль utf8. Запрос от LDAP возвращается без указания
признака, что является unicode.
Приходится принудительно включать:

Encode::_utf8_on($variable);

WinLin
()

> 1) вызов внешней программы через кавычки: `<команда>`

Боюсь, никак. Открывай дескриптор явно, через open(PIPE, "command |"); и делай binmode на него.

> 2) безымянный дескриптор, через который читается стандартный ввод и файлы, переданные в качестве парамаетров: while ( <> ) { <команды>; }

Это не "безымянный десриптор", а всего лишь алиас для STDIN, вроде как.

> 3) параметры командной строки

видимо, никак.

> Ещё не понимаю, почему указание прагмuse utf8; use locale; при локали utf8 не приводит к тому, что всё вышеперечисленное символьно-ориентировано, а не байт-ориентировано. Можно ли указать, что ВСЁ - символы, без исключений?

Либо недоделали, либо решили, что less magic в данном случае - лучше.

anonymous
()
Ответ на: комментарий от anonymous

> > 1) вызов внешней программы через кавычки: `<команда>`

> Боюсь, никак. Открывай дескриптор явно, (...)

use open ":чего-то-там";

теоретически должно делать то что нужно. Практически делает чего-то странное, т.е. перекодирует, но "забывает" поставить флажок что это символы а не байты. ХЗ. См. open(3).

alexs
()
Ответ на: комментарий от WinLin

Огромное спасибо, то что нужно. Теперь есть костыли и подпорки для любого случая :)

router ★★★★★
() автор топика
Ответ на: комментарий от anonymous

>Открывай дескриптор явно, через open(PIPE, "command |"); и делай binmode на него.

Точно, про это я зыбыл. Спасибо, одной проблемой меньше

>Это не "безымянный десриптор", а всего лишь алиас для STDIN, вроде как.

Нет, это точно не алиас. Правда, как называется по науке забыл.

>никак.

WinLin оказался прав, для любого скаляра можно сделать Encode::_utf8_on($variable); Подошло и для параметров командной строки, и для результата вызова команды.

>>Можно ли указать, что ВСЁ - символы, без исключений?

>Либо недоделали, либо решили, что less magic в данном случае - лучше.

Жаль. Буду искать :)

Кстати, существуют ли листы рассылки, посвящённые perl?

router ★★★★★
() автор топика
Ответ на: комментарий от alexs

Ураааа!!! Вот это - то что надо! Спасибо!

>Практически делает чего-то странное, т.е. перекодирует

У меня работает. Наверное, вы имели в виду, что не влияет на уже открытые дескрипторы. Из вновь открываемых читаются уже символы, а для STD{IN,OUT,ERR} можно и вручную binmode установить.

Блин, ведь читал про open в perdoc -f binmode , но почему-то решил, что это относится только к команде open, вроде open MYFILE, ">:utf8", "<имя файла>".

Ещё раз спасибо, теперь намного удобнее работать с юникодом

router ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.