Я уже прочитал следующее:
- Perl Unicode Cookbook
- Как отличается открытая прагма с разными utf8?
- Как использовать кодировку utf8 с открытой pragma
- Воздействует ли автодо-прагма на кодировку?
- многие другие... (например: perlunicode perluniintro, perlunifaq, perlunitut)...; (
- и, конечно, ответ tchrist geniue Почему современный Perl предотвращает UTF-8 по умолчанию?
но, возможно, пропустили некоторые ОСНОВНЫЕ точки.
Используя
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
версией, выполняющей декодирование.