# NAME Octets::To::Unicode - модуль утилит Ð´Ð»Ñ Ñ€Ð°ÑÐ¿Ð¾Ð·Ð½Ð°Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ текÑта (в том чиÑле в файлах) и его Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ # 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,' # ПеревеÑти файлы во временные в кодировке utf-8 (в /tmp) и поÑле Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ и их Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¸Ñать обратно в определён ной кодировке: # (тут $1 - первый файл, $2 - второй и Ñ‚.д., $* - вÑе файлы через пробел. Так же работают подÑтановки ${1} и Ñ‚.д.) $ ru-utf8 file1 file2 -c 'perltidy $1 -st > $2' # DESCRIPTION Пакет включает в ÑÐµÐ±Ñ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚Ñ‹: - **ru-perltidy** — форматирует файлы через perltidy c определением их кодировки; - **ru-utf8** — переводит файлы во временные (в кодировке utf-8), выполнÑет указанную команду и перепиÑывает обратно в определённой кодировке; и модуль 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). # INSTALL УÑтановить можно любым менеджером `perl` Ñо **CPAN**, например: $ 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 вмеÑто метки C<{{$NEXT}}>. - Ðктивировать локальную библиотеку: $ cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) Ðто нужно, чтобы не выполнÑÑ‚ÑŒ релиз под рутом. - Выполнить релиз: $ minil release Ð’ процеÑÑе Минилла задаÑÑ‚ неÑколько вопроÑов, в чаÑтноÑти предложит выбрать номер новой верÑии. Обычно на вÑе вопроÑÑ‹ нужно отвечать кнопкой "enter". Иначе лучше прервать процеÑÑ Ð¸ внеÑти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² конфигурационные файлы. # AUTHOR Yaroslav O. Kosmina <darviarush@mail.ru> # LICENSE âš– **GPLv3**