Как работает open: utf8 pragma в perl - в отношении модулей CPAN?

Я уже прочитал следующее:

но, возможно, пропустили некоторые ОСНОВНЫЕ точки.

Используя

use open(:utf8);

Также влияет на модули cpan? Например. когда какой-либо модуль CPAN открывает любой файл, он будет открыт с помощью :utf8? Является ли это утверждение TRUE? (или открытая прагма только лексически ограничена?) AFAIK - это тоже влияет на модули, но на "непоследовательном" пути (возможно, это проблема модулей).

Воздействие open pragma на opendir? - что я уже пробовал - нет - мне все еще нужно дополнительное decode для всех имен файлов, исходящих из readdir (в дополнение к NFC). Итак, IO:: Dir - это что-то другое - какая открытая прагма не распространяется?

Воздействовать на открытую прагму sockets, трубы тоже? (например, что-то вроде IO:: Handle?)

Все (или большинство) модулей CPAN знает, когда делать i/o, как им это нужно (utf8 или latin1 или raw?) (вероятно, нет, потому что простой autodie не работает с open прагмой...:()

Во многих местах я могу прочитать аналогичное правило: Помните каноническое правило Unicode: всегда кодируйте/декодируйте по краям вашего приложения. Это хорошее правило, но край приложения означает: собственный исходный код. Модули CPAN (обычно) за краем тоже - не только "внешний мир", например система или сеть...

Из моего опыта, 3/4 контента, мои короткие скрипты (что сильно использует CPAN) содержат: верхние объявления и десятки кодировок/декодирования/NFC почти для всего...

т.д.: Даже утилиты протоколирования требуют явного кодирования:

use Log::Any qw($log);
use Log::Any::Adapter ('File', 'file.log');
$log->error( encode('utf-8', "tökös"));

Даже если вы хотите добавить tie в мой код, замените каждый $key $value на кодированные версии.

Является ли это правдой, или я пропустил какую-то действительно основную точку во всем вышеописанном doccu?

Некоторые модули CPAN, обрабатывающие utf8 (внутри), такие как JSON:: XS, YAML:: XS, File:: Slurp.. (почти никогда не удалось получить правильные "вещи" от YAML:: XS, чистые YAML и JSON:: XS работает без проблем...

Для некоторых модулей существует "хаки" - как DBIx::Class::ForceUTF8, Template::Stash::ForceUTF8, HTML::FillInForm::ForceUTF8 - и так, - что не позволяет писать правильное приложение для "обоих" utf и non-utf world...; (

Многие модули CPAN не вызывают внутренне вышеперечисленные "взломанные варианты" - (например, HTML::FillInForm::ForceUTF8), а только простые, поэтому их невозможно использовать с utf8... Другие, молча проваливаются.; (

Приложение Plack не обрабатывает сообщения регистрации utf8 без раздражающего "Wide character...."; (/modern perl: (и может продолжаться; (

Из вышесказанного я "вычитал" (возможно, ошибочно) - чем я ДОЛЖЕН знать и запоминать для каждого модуля CPAN, как он обрабатывает строки, закодированные utf8, и потому, что нигде какой-то "реестр" - это главным образом, пробная версия/ошибка.

Итак, главный вопрос:

В то время как я вспоминаю: здесь нет волшебной пули, , но здесь какой-то хороший способ, как обнаружить и узнать "готовые модули CPAN для utf8", что не требует специального кодирования/декодирования перед их использованием?

Если кто-то должен знать, я использую следующий в каждом script:

use 5.014;
use warnings;
use utf8;
use feature qw(unicode_strings);
use charnames qw(:full);
use open(:utf8); #this sometimes is bad, so using only open qw(:std :utf8);
use Encode qw(encode decode);
use Unicode::Normalize qw(NFD NFC);

Hm.. просто "открыл" модуль utf8:all perl, заменив readdir версией, выполняющей декодирование.

Ответ 1

Шахта Эмпахиса:

Прагма open служит в качестве одного из интерфейсов для объявления стандартных "уровней" (также называемых "дисциплин" ) для всех операций ввода-вывода. Любые два аргумента open, readpipe (aka qx//) и аналогичные операторы, найденные в лексической области этой прагмы, будут использовать объявленные значения по умолчанию. Даже три аргумента open могут быть затронуты этой прагмой, когда они не указывают слои IO в MODE.

Нет, это не влияет на код, в котором отсутствует прагма. Однако дескриптор, открытый в рамках такой прагмы, не потеряет свои слои, если передать код за пределы области прагмы.


Проверяет, что ожидает модуль:

Ввод

  • Тест 1
    • Имейте исходный источник, возвращающий строку, содержащую кодовую точку в 80..FF и без кодовой точки выше FF.
  • Тест 2
    • Имейте исходный источник, возвращающий строку, содержащую кодовую точку над FF.

Выход

  • Тест 1
    • Вывести строку, содержащую кодовую точку в 80..FF и без кодовой точки над FF. Сначала передайте строку через utf8::downgrade($_);.
  • Тест 2
    • То же, что и Test 1, но сначала передайте строку через utf8::uprade($_);.
  • Тест 3
    • Вывести строку, содержащую точку кода выше FF