# NAME Octets::To::Unicode - модуль и утилиты ru-perltidy и ru-utf8 Ð´Ð»Ñ Ñ€Ð°ÑÐ¿Ð¾Ð·Ð½Ð°Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ текÑта (в том чиÑле в файлах) и его декодированиÑ. # VERSION 0.01 # SYNOPSIS use Octets::To::Unicode; my $unicode = decode "Стар Трек"; my ($unicode, $encoding) = decode "Стар Трек"; my $unicode = decode $octets_in_cp1251_or_maybe_in_utf8, [qw/cp1251 utf-8/]; my $encoding = detect $octets; my $encoding = detect $octets, [qw/cp1251 utf-8/]; my ($file_text_in_unicode, $encoding) = file_decode "path/to/file", ["cp1251", "koi8-r"]; file_encode "path/to/file2", "koi8-r", $file_text_in_unicode; ИÑпользование утилит: # Отформатировать указанные файлы perltidy: $ ru-perltidy file1 file2 # Указать кодировку: $ ru-perltidy file1 file2 -e utf-8,cp1251 # Форматирует только изменённые файлы в репозитории git: $ ru-perltidy # Форматирует изменённые файлы в ветке (на Ñлучай, еÑли забыл отформатировать перед комитом): $ ru-perltidy --in-branch # Указать раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²: $ ru-perltidy --ext 'pl,pm,' # Обработать файлы в директориÑÑ…: $ ru-perltidy --in-dir .,/tmp/mydir # Выполнить операцию Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸: $ ru-utf8 file1 file2 -c 'perltidy $f -st > $o' # Переменные, которые можно иÑпользовать: $ ru-utf8 file1 file2 -c 'echo $f $o $e $x' $ ru-utf8 file1 file2 -o -c 'echo $f1 $o1 $e1 $x1 - $f2 $o2 $e2 $x2' # Кроме команды шелла можно иÑпользовать ещё код perl: $ ru-utf8 file1 file2 -s 'print "$f $o $e $x -- $unicode\n"' $ ru-utf8 file1 file2 -o -s 'print "@f @o @e @x"' # Определить кодировку файлов и перекодировать их в koi8-r: $ ru-encode -t koi8-r # DESCRIPTION Пакет включает в ÑÐµÐ±Ñ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚Ñ‹: - **ru-perltidy** — форматирует файлы через perltidy c определением их кодировки; - **ru-utf8** — переводит файлы во временные (в кодировке utf-8), выполнÑет указанную команду и перепиÑывает обратно в определённой кодировке; - **ru-encode** — перекодирует файлы в указанную кодировку. и модуль perl: - **Octets::To::Unicode** — модуль c функциÑми Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ текÑта и его ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ кодировками. **Octets::To::Unicode** предоÑтавлÑет необходимое множеÑтво утилит Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ текÑта и его декодированиÑ, а так же — работы Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸. Ð’ 2000-Ñ… определилаÑÑŒ Ñ‚ÐµÐ½Ð´ÐµÐ½Ñ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð¸Ñ‚ÑŒ проекты в национальных кодировках в utf-8. Однако не везде их перевели одним махом, а решили рубить Ñобаке хвоÑÑ‚ поÑтепенно. Ð’ результате во многих проектах чаÑÑ‚ÑŒ файлов c кодом в utf-8, а чаÑÑ‚ÑŒ — в национальной кодировке (cp1251, например). Ещё одной проблемой могут Ñлужить урлы Ñ ÑÑкейп-поÑледоваительноÑÑ‚Ñми. Ðапример, https://ru.wikipedia.org/wiki/Молчание#Золото преобразуетÑÑ Ð² меÑÑенджере, куда Ñту ÑÑылку можно Ñкопировать, в https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D0%B5#%D0%97%D0%BE%D0%BB%D0%BE%D1%82%D0%BE. Причём один меÑÑенджер переведёт руÑÑкие Ñимволы в utf-8, другой — в cp1251, третий — в koi8-r. Чтобы решить Ñти две проблемы в приложениÑÑ… и был напиÑан Ñтот модуль. # SUBROUTINES/METHODS ## bohemy $num = bohemy $unicode; Возвращает чиÑловую характериÑтику похожеÑти текÑта на руÑÑкий. Ðлгоритм оÑнован на наблюдении, что в руÑÑком Ñзыке Ñлово начинаетÑÑ Ð½Ð° пропиÑную или Ñтрочную букву, а затем ÑоÑтоит из Ñтрочных букв. Таким образом, чиÑÐ»Ð¾Ð²Ð°Ñ Ñ…Ð°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð¸Ñтика, Ñто Ñумма длин руÑÑко-похожих Ñлов Ñ Ñ€Ð°Ð·Ð½Ð¸Ñ†ÐµÐ¹ Ñуммы длин руÑÑко-непохожих. Принимает параметр: - **$unicode** ТекÑÑ‚ в юникоде (Ñ Ð²Ð·Ð²ÐµÐ´Ñ‘Ð½Ð½Ñ‹Ð¼ флажком utf8). ## decode $unicode = decode $octets, $encodings; ($unicode, $encoding) = decode $octets, $encodings; Возвращает декодированный текÑÑ‚ в ÑкалÑрном контекÑте, а в ÑпиÑочном, ещё и определённую кодировку. ЕÑли ни одна из кодировок не подошла, то вмеÑто юникода в первом параметре возвращаютÑÑ Ð¾ÐºÑ‚ÐµÑ‚Ñ‹, а вмеÑто кодировки - `undef`: ($octets, $encoding_is_undef) = decode $octets, []; Принимает параметры: - **$unicode** ТекÑÑ‚ в юникоде (Ñ Ð²Ð·Ð²ÐµÐ´Ñ‘Ð½Ð½Ñ‹Ð¼ флажком utf8). - **$encodings** CпиÑок кодировок, которыми предлагаетÑÑ Ð¿Ð¾Ð¿Ñ€Ð¾Ð±Ð¾Ð²Ð°Ñ‚ÑŒ декодировать текÑÑ‚. ÐеобÑзательный. Значение по умолчанию: `[qw/utf-8 cp1251 koi8-r/]`. ## detect $encoding = detect $octets, $encodings; Возвращает определённую кодировку или `undef`. Параметры такие же как у ["decode"](#decode). ## file\_find @files = file_find $path_to_directory; Ищет файлы в директориÑÑ… рекурÑивно и возвращает ÑпиÑок путей к ним. Принимает параметр: - **$path\_to\_directory** Путь к файлу или директории. ЕÑли путь не ведёт к директории, то он проÑто возвращаетÑÑ Ð² ÑпиÑке. ## file\_read $octets = file_read $path; Считывает файл. Возвращает текÑÑ‚ в октетах. ВыбраÑывает иÑключение, еÑли открыть файл не удалоÑÑŒ. Принимает параметр: - **$path** Путь к файлу. ## file\_write file_write $path, $octets_or_unicode; ПерезапиÑывает файл Ñтрокой. Ðичего не возвращает. ВыбраÑывает иÑключение, еÑли открыть файл не удалоÑÑŒ. Принимает параметры: - **$path** Путь к файлу. - **$octets\_or\_unicode** Ðовое тело файла в октетах или юникоде. ## file\_decode $unicode = file_decode $path, $encodings; ($unicode, $encoding) = file_decode $path, $encodings; Возвращает декодированный текÑÑ‚ из файла в ÑкалÑрном контекÑте, а в ÑпиÑочном, ещё и определённую кодировку. ЕÑли ни одна из кодировок не подошла, то вмеÑто юникода в первом параметре возвращаютÑÑ Ð¾ÐºÑ‚ÐµÑ‚Ñ‹, а вмеÑто кодировки - `undef`: ($octets, $encoding_is_undef) = file_decode $path, []; Принимает параметры: - **$path** Путь к файлу. - **$encodings** CпиÑок кодировок, которыми предлагаетÑÑ Ð¿Ð¾Ð¿Ñ€Ð¾Ð±Ð¾Ð²Ð°Ñ‚ÑŒ декодировать текÑÑ‚. ÐеобÑзательный. Значение по умолчанию: `[qw/utf-8 cp1251 koi8-r/]`. ## file\_encode file_encode $path, $encoding, $unicode; ПерепиÑывает текÑÑ‚ в файле в указанной кодировке. Принимает параметры: - **$path** Путь к файлу. - **$encoding** Кодировка в которую Ñледует перевеÑти параметр `unicode` перед запиÑью в файл. - **$unicode** Ðовый текÑÑ‚ файла в юникоде (Ñ ÑƒÑтановленным флажком utf8). ## test\_file $is_file = test_file $file, $exts, $interpreters; ТеÑтирует файл на ÑоответÑтвие указанным раÑширениÑм, а еÑли раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚, то на ÑоответÑвие интерпретаторов к указанному в первой Ñтроке файла начинающейÑÑ Ð½Ð° `#!`. Принимает параметры: - **$file** Путь к файлу. ОбÑзательный. - **$exts** СпиÑок раÑширений Ð´Ð»Ñ ÑопоÑтавлениÑ, еÑли он пуÑÑ‚, то подходит любое. ÐеобÑзательный. Значение по умолчанию: `[]`. - **$interpreters** СпиÑок интерпретаторов Ð´Ð»Ñ ÑопоÑтавлениÑ, еÑли он пуÑÑ‚, то подходит любой, главное, чтобы Ñтрока начиналаÑÑŒ на `#!`. ÐеобÑзательный. Значение по умолчанию: `[]`. ## test\_files @files = test_files $files, $exts, $interpreters; ТеÑтирует файлы на ÑоответÑтвие указанным раÑширениÑм или интерпретаторам. Принимает параметры: - **$files** СпиÑок файлов. ОбÑзательный. - **$exts** Такой же как в **test\_file**. - **$interpreters** Такой же как в **test\_file**. ## change\_files @files = change_files(); Возвращает изменённые файлы в репозитории git. ## change\_files @files = change_files_in_branch(); Возвращает изменённые файлы в ветке. # INSTALL УÑтановить можно любым менеджером `perl` Ñо **CPAN**, например: $ sudo cpm install -g Octets::To::Unicode # DEPENDENCIES ЗавиÑит от модулей: - Getopt::Long - Encode - List::Util - Pod::Usage - Term::ANSIColor и от **perltidy** опционально: - Perl::Tidy # RELEASE Релиз на **CPAN** оÑущеÑтвлÑетÑÑ Ñ‚Ð°Ðº: - Обновить иÑходники: $ git pull - Отредактировать файл _Changes_. Ð’ файле _Changes_ нужно напиÑать ÑпиÑок изменений, которые вошли в Ñтот релиз. Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑываютÑÑ Ð² виде ÑпиÑка, одно изменение — один Ñлемент ÑпиÑка. Ðлементы ÑпиÑка обозначаютÑÑ Ñимволами тире \`-\`. СпиÑок Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми нужно размеÑтить между Ñтрокой \`{{$NEXT}}\` и Ñтрокой Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð¸Ð¼ релизом. ДопуÑтим, предыдущий релиз был 1.71. Тогда опиÑание изменений нового релиза будет выглÑдеть так: {{$NEXT}} - RU-5 Какой-то тикет, который вошел в релиз. - RU-6 Ещё один тикет, вошедший в релиз. 1.71 2021-05-07T08:52:18Z - RU-4 Какой-то предыдущий тикет. Обратите внимание — у нового релиза пока нет верÑии. ВерÑÐ¸Ñ Ð±ÑƒÐ´ÐµÑ‚ вычиÑлена Миниллой при выполнении релиза и автоматичеÑки впиÑана в файл _Changes_ вмеÑто метки `{{$NEXT}}`. - Ðктивировать локальную библиотеку: $ cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) Ðто нужно, чтобы не выполнÑÑ‚ÑŒ релиз под рутом. - Выполнить релиз: $ minil release Ð’ процеÑÑе Минилла задаÑÑ‚ неÑколько вопроÑов, в чаÑтноÑти предложит выбрать номер новой верÑии. Обычно на вÑе вопроÑÑ‹ нужно отвечать кнопкой "enter". Иначе лучше прервать процеÑÑ Ð¸ внеÑти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² конфигурационные файлы. # LINKS - perltidy и cp1251 / [https://habr.com/ru/post/664308/](https://habr.com/ru/post/664308/). # AUTHOR Yaroslav O. Kosmina <darviarush@mail.ru> # LICENSE âš– **GPLv3**