[Moscow.pm] unicode & regexp

Victor Efimov victor на vsespb.ru
Чт Май 22 23:41:39 PDT 2014


допустим в ФС находятся файлы не в той кодировке. такого не должно
быть, но бывает (очень часто, обычно
как раз у юзеров которые что-то проограммируют, и их самописные
скрипты неправильно обращаются с кодировками)
и это не причина чтобы в программе был баг

touch $(echo раз|iconv -t windows-1251)
touch $(echo два|iconv -t windows-1251)

cat e.pl

use Getopt::Long;
use utf8::all;
use Data::Dumper;
my %h = map { $_ => 1} @ARGV;
print Dumper \%h;
__END__

perl e.pl *

$VAR1 = {
          'e.pl' => 1,
          "\x{fffd}\x{fffd}\x{fffd}" => 1
        };

(т.е. два уникальных файла в каталоге, причём имя второго - не
правильное, да и файла на самом деле должно быть три)

а без use utf8::all:

$VAR1 = {
          '���' => 1,
          'e.pl' => 1,
          '���' => 1
        };

т.е. операционная система технически передаёт в скрипт бинарные
данные, которые не обязательно являются текстом в какой-либо
кодировке.
может передавать что угодно.

да можно ещё много сценаривет придумать. я уж не говорю пр то что
локаль может быть не-UTF8 (под *BSD), не понятно зачем смешивать
юникод (в котором
работает perl, не зависимо от локали) и вывод stdout/stderr, ввод
@ARGV которые, обычно совпадают с локалью и ещё readdir (который может
не совпадать с локалью)

23 мая 2014 г., 1:20 пользователь Nick Knutov <mail на knutov.com> написал:
> А можно пример из реальной жизни, когда в @ARGV бинарные данные, которые
> интерпретируются как символы и всё получается не так, как должно быть?
>
>
> 23.05.2014 2:09, Victor Efimov пишет:
>> Всякие эти модули и советы типа "какие 10 прагм включить чтобы с
>> unicode было всё ок" делают разбор полётов только сложнее
>> utf8::all пытается интерпретировать @ARGV как символы, хотя это
>> бинарные данные (и делает это глобально, что может вызвать проблемы во
>> всяких getopts модулях), пытается интерпретировать имена файлов как
>> символы, хотя в linux это бинарные данные, это есть, но не
>> документировано
>> https://github.com/doherty/utf8-all/commit/bc37b2a3dc73332c587c195cb119a0450aa36afa
>>
>>
>> 22 мая 2014 г., 23:27 пользователь Stanislaw Pusep
>> <creaktive на gmail.com> написал:
>>> Вместо:
>>>
>>> use utf8;
>>>
>>> Пишем:
>>>
>>> use utf8::all;
>
> --
> Best Regards,
> Nick Knutov
> http://knutov.com
> ICQ: 272873706
> Voice: +7-904-84-23-130
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org


Подробная информация о списке рассылки Moscow-pm