Распаковка zip с дважды кривой кодировкой

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
Аватара пользователя
Minton
Сообщения: 1588
Статус: openSUSE Localization Team
ОС: openSUSE Tumbleweed x86-64

Распаковка zip с дважды кривой кодировкой

Сообщение Minton »

Коллеги, мне тут подкинули файл поупражняться, но уже голова кругом.
Есть zip-архив, созданный на каком-то безвременно почившем китайском noname-планшете, и файлы при распаковке именуются примерно так:
збз▌зцз╓зтзрз╙з╤. з╖зтзхзузфз╤з▌зюз▀зэз█ з▌з╤з╥з┌зтз┌з▀зф.fb2
згз┌зъз▀з╓з╙зуз▄з╤зё. зйз╤з╥зэзфз╤зё зуз▄з╤з┘з▄з╤.fb2
зйзрзтз┌зщ. з│з╙зрз╒ з▓з╤з╙з▀зрз╙з╓зуз┌зё 1. знзЁз╥з┌ з┌ з╙з▌з╤зузфз╙зхз█.fb2

Декодер Лебедева утверждает, что это преобразование CP866 → GB2312, но я уже перебрал все мыслимые комбинации входящей и исходящей кодировок, а iconv мне так нормальный список файлов и не показывает. Подскажите, как из этого счастья получить нормальные имена файлов в UTF8.
Русский раздел на forums.opensuse.org :)

"Настоящие мужчины используют поиск" ©Goodvin
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Распаковка zip с дважды кривой кодировкой

Сообщение Bizdelnick »

$

$ echo 'збз▌зцз╓зтзрз╙з╤. з╖зтзхзузфз╤з▌зюз▀зэз█ з▌з╤з╥з┌зтз┌з▀зф.fb2' | iconv -t cp866 | iconv -f gb2312 Алферова. Хрустальный лабиринт.fb2 $


Upd. Поясню, как тут можно допереть, что к чему.
Во-первых, видим кириллицу, значит последнее преобразование было из некой кириллической кодировки в кодировку локали (UTF-8). Что это за кириллическая кодировка, декодер подсказал правильно, но можно было и так догадаться по обилию символов для рисования таблиц.
Во-вторых, судя по частоте повторения одного и того же символа "з", перед этим имело место преобразование исходного UTF-8 в какую-то другую кодировку. Что это за кодировка — декодер сказал, опять-таки, правильно.
Чтобы вернуться к корректной UTF-8, надо выполнить преобразования в обратном порядке: UTF-8→CP866, GB2312→UTF-8.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Minton
Сообщения: 1588
Статус: openSUSE Localization Team
ОС: openSUSE Tumbleweed x86-64

Re: Распаковка zip с дважды кривой кодировкой

Сообщение Minton »

Отлично, почти всё получилось. GB1232 — единственная известная декодеру Лебедева китайская кодировка, но некоторые символы там таки отсутствуют (тире, например), поэтому довольно быстро iconv начал затыкаться, гораздо более хорошие результаты принесло использование кодировки GBK (либо GB18030, тот же набор кириллицы). Кавычек нет нигде, но таких названий всего несколько, проще руками перебить.
Ещё десяток файлов оказались в какой-то совсем другой кодировке, часть вообще поименована знаками вопроса (т.е. имена побились ещё до упаковки), с их потерей я предпочёл смириться.
Если для распаковки использовать Ark, то вместо CP866 там оказывается CP1252, поэтому итоговая команда приобрела следующий вид:

Код: Выделить всё

find . -type f -exec bash -c 'oldname="$1"; newname="$(echo $oldname | iconv -t CP1252 | iconv -f GBK)";mv "$oldname" "$newname"' _ {} \;

Разумеется, можно было написать покороче, но я отлаживал по частям :)
Русский раздел на forums.opensuse.org :)

"Настоящие мужчины используют поиск" ©Goodvin
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Распаковка zip с дважды кривой кодировкой

Сообщение Bizdelnick »

Если там только fb2, может проще переименовать по автору и названию, как они прописаны в самом файле?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Minton
Сообщения: 1588
Статус: openSUSE Localization Team
ОС: openSUSE Tumbleweed x86-64

Re: Распаковка zip с дважды кривой кодировкой

Сообщение Minton »

Да, это было бы разумнее всего, но iconv у меня уже был установлен, а никаких утилит для работы с fb2 на ум не пришло.
Четыре файла почему-то бились при распаковке на xfs домашнего раздела (unzip утверждал, что «file name too long»), попытка с NTFS прошла нормально, в итоге оставшиеся семь файлов просто руками переименовал.
Ещё раз спасибо за помощь.
Русский раздел на forums.opensuse.org :)

"Настоящие мужчины используют поиск" ©Goodvin
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Распаковка zip с дважды кривой кодировкой

Сообщение MiK13 »

А можно ли вообще нормально работать под линуксом с ZIP-архивами? А то мне приходится для этого виндовый pkzipc.exe держать.
То есть если имена файлов укладываются в ASCII, то проблем нет. А вот если там русские имена, то у меня вместо русских букв вопросы появляются.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Распаковка zip с дважды кривой кодировкой

Сообщение Bizdelnick »

MiK13 писал(а):
18.01.2017 22:37
А можно ли вообще нормально работать под линуксом с ZIP-архивами?

С ними вообще нельзя нормально работать. By design. Используйте tar, для переноса на винду — 7-zip.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить