Крякозябры ZIP (в какой они кодировке? :))

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

Ответить
frp
Сообщения: 1445
ОС: Debian Squeeze

Крякозябры ZIP

Сообщение frp »

Вечная проблема неудобство: при распаковке zip-ов с файлами с русскими названиями файлов получаются крякозябры. Сначала боролся при помощи WinRAR. Теперь решил сделать по-человечески - написать скрипт, который бы переименовывал правильно.
В какой кодировке имена файлов в зипах? Судя по выводу ls | iconv -f cp1251, там не cp1251.
Спасибо сказали:
iglezz
Сообщения: 43
ОС: Debian testing

Re: Крякозябры ZIP

Сообщение iglezz »

Как-то раньше это уже обсуждалось на этом форуме... Вот тут.
По мотивам обсуждения я записал себе в склерозник такой однострочник:

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

cd <каталог_куда_распакован_архив_с_битыми_именами_файлов> && find . -type f | while read f; do fnew=`echo "$f" | iconv -t iso8859-1 | iconv -f cp866`; echo "\"$f\" -> \"$fnew\""; mv -T "$f" "$fnew"; done

Не самый оптимальный вариант, но работающий (на тех архивах, что мне попадались). Восстанавливает только имена файлов, не каталогов (ибо такие архивы мне не попадались пока :)).
edit: Работает для файлов, распакованных 7-zip`ом.

upd:
Похоже однострочник работал на архивах по почте принятых, ибо создал сейчас в виртуалке zip ТоталКоммандером и получил кукиш при попытке востановить покоцаные unzip'ом имена файлов. 7-zip тоже чудит...
unzip версии 6.0-4
p7zip версии 9.04~dfsg.1-1
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Крякозябры ZIP

Сообщение eddy »

У меня 7z распаковывает в нормальной кодировке (возможно, iconv или enca в него включены).
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Крякозябры ZIP

Сообщение frp »

iglezz писал(а):
19.01.2011 18:55
По мотивам обсуждения я записал себе в склерозник такой однострочник:

Не работает. Пишет ошибки:

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

iconv: недопустимая входная последовательность в позиции 2
<крякозябры>

И понятно почему: вы пытаетесь преобразовать крякозябры в iso8859-1 (это Latin-1) (iconv -t iso8859-1), а соответствующих символов там нет.
eddy писал(а):
19.01.2011 20:14
У меня 7z распаковывает в нормальной кодировке (возможно, iconv или enca в него включены).

У меня если указана локаль ru_UA.UTF-8, то 7z генерит крякозябры, которые мне так и не удалось обработать. Если указана любая не-юникодная, то имена в cp866.

А обычный unzip генерит что-то странное: пробовал преобразовывать полученное из любой известной мне русской кодировки и ничего вразумительного не получилось.
Спасибо сказали:
iglezz
Сообщения: 43
ОС: Debian testing

Re: Крякозябры ZIP

Сообщение iglezz »

Как вариант, можно использовать такое преобразование (на всякий случай прицепил архивчик, на котором оно работает):

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

iconv -f cp1252 -t cp850 | iconv -f cp866


Первый вариант раньше, видимо, работал. Почему — х.з. Видимо такой зип был. Решение было буквально вымучано на один или два вечера...

Хотелось бы и для 7-zip подобрать решение...

Вложения
1.ZIP
(718 байт) 61 скачивание
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Крякозябры ZIP

Сообщение frp »

iglezz писал(а):
19.01.2011 18:55
Вот тут.

Спасибо, разобрался.
unzip -Z1 filename.zip | iconv -f cp1252 -t cp850 | iconv -f cp866

Этот однострочник позволяет посмотреть список файлов.

PS. Запилил свою переименовалку на AWK + простенький BASH-скрипт в качестве запускалки awk с нужными параметрами (пока, правда, не умеет работать с папками).
Спасибо сказали:
iglezz
Сообщения: 43
ОС: Debian testing

Re: Крякозябры ZIP

Сообщение iglezz »

Грабли на этом не заканчиваются.

Вот ещё один зип, с теми же файлами, только созданый средствами Windows XP — iconv -f cp1252 -t cp850 | iconv -f cp866 уже не работает...

frp,
А скрипт этот сразу переименовывает или для начала просто показывает что будет в итоге? Первый вариант чреват последствиями может быть...

upd:
Нашёл откуда conv -t iso8859-1 | iconv -f cp866 взялся.
Таким образом приводятся в порядок имена файлов при распаковке этих злосчастных зипов при помощи 7-zip. Причём имена восстанавливает в обоих случаях (в обоих архивах, вышеприцепленный 1.zip и 2xp.zip из этого сообщения).

upd2:
frp,
для скрипта может сгодится:

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

$ hexdump -n 8 -C архив_созданный_totalcommander.zip
00000000  50 4b 03 04 14 00 02 00                           |PK......|
$ hexdump -n 8 -C архив_созданный_winxp.zip
00000000  50 4b 03 04 0a 00 00 00                           |PK......|
$ hexdump -n 8 -C 7zip_windows.zip
00000000  50 4b 03 04 14 00 00 00                           |PK......|

Zip-архив, созданный с помощью 7-Zip (win32) тоже после unzip не может востановить имена с помощью iconv -f cp1252 -t cp850 | iconv -f cp866

Вложения
2xp.zip
(718 байт) 35 скачиваний
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Крякозябры ZIP

Сообщение frp »

iglezz писал(а):
19.01.2011 22:44
Вот ещё один зип, с теми же файлами, только созданый средствами Windows XP — iconv -f cp1252 -t cp850 | iconv -f cp866 уже не работает...

iglezz
В приведенном вами архиве имена просто в cp866, без особых извращений.
Интересно, а как, скажем, WinRAR, или хотя бы дефолтный виндовый архиватор (если его можно так обозвать), определяют, в какой там кодировке имена файлов?

PS. Можете еще поискать архивы, на которых подобные методы не прокатывают?
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Крякозябры ZIP

Сообщение ZyX »

У меня для получения имён файлов в обоих архивах прокатывало такое:

(Created by format.vim)

LANG=C 7z l $ARCHIVE | enconv


Распаковывать не пробовал. Вот что говорит enca:

/tmp/zsh - 1 (Created by format.vim)

(zyx:~/tmp) % LANG=C 7z l 1.ZIP | enca IBM/MS code page 866 LF line terminators (zyx:~/tmp) % LANG=C 7z l 2xp.zip | enca IBM/MS code page 866 LF line terminators


Спасибо сказали:
iglezz
Сообщения: 43
ОС: Debian testing

Re: Крякозябры ZIP

Сообщение iglezz »

frp
Действительно, кодировка одна. И unzip при этом умудряется по-разному их покалечить...

ZyX
Спасибо, выпала как-то сия замечательная програмка из поля зрения моего...
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: Крякозябры ZIP

Сообщение /dev/random »

app-arch/unzip и русский в именах файлов

Писал когда-то патч, добавляющий в unzip нормальную перекодировку. Версия 5.52, но, думаю, переделать по аналогии современную версию будет несложно.

Чуть ниже поста, на который я дал ссылку, приводится альтернативный патч, который в теории должен подходить к любой версии, но я его не проверял.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Крякозябры ZIP

Сообщение frp »

ZyX
Буду использовать 7z, кодировка одна на выходе получается, в отличии от unzip.

/dev/random
А вы не пробовали отправить ваш патч разработчикам unzip?

Как будет время, попробую адаптировать его для более новой версии и собрать debian-пакет.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Крякозябры ZIP

Сообщение eddy »

frp писал(а):
20.01.2011 20:06
А вы не пробовали отправить ваш патч разработчикам unzip?

А зачем нужен unzip сам по себе, если 7z вызывает его же, но через iconv или enca? У меня, например, никогда не было проблем с кодировками файлов, разархивируемых 7z (хоть из зипа, хоть из рара). А вот сами unzip и unrar отдают файлы в той же кодировке, в какой их записывали.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Крякозябры ZIP

Сообщение ZyX »

eddy писал(а):
20.01.2011 21:26
frp писал(а):
20.01.2011 20:06
А вы не пробовали отправить ваш патч разработчикам unzip?

А зачем нужен unzip сам по себе, если 7z вызывает его же, но через iconv или enca? У меня, например, никогда не было проблем с кодировками файлов, разархивируемых 7z (хоть из зипа, хоть из рара). А вот сами unzip и unrar отдают файлы в той же кодировке, в какой их записывали.

Доказательства?

~/tmp/image/p7zip_9.13/zsh - 1 (Created by format.vim)

(zyx:tmp/image/p7zip_9.13) % grep -r -i -w unzip . -C 10 ./ChangeLog- ./ChangeLog-Version 4.56 (never published) ./ChangeLog-============ ./ChangeLog- - From Windows version of 7-zip 4.56 : ./ChangeLog- - Some bugs were fixed ./ChangeLog- ./ChangeLog- - On HPUX : fixed "Can't load '../bin/7z.dll'" ./ChangeLog- (Unsatisfied data symbol '_ZTVN10__cxxabiv121__vmi_class_type_infoE' in load module '../bin/7z.so'.) ./ChangeLog- ./ChangeLog- - bug : p7zip used to build a zip file with an "FAT" header instead of "Unix" header ./ChangeLog: If LANG was set, "unzip" tried to translate the filenames from "FAT" to locale ... ./ChangeLog- ./ChangeLog- - On AIX : fixed "HugeFiles=off" (thank kuriath) ./ChangeLog- ./ChangeLog- - bug #1800180 : LZMAlone compilation error in COutFile ./ChangeLog- ./ChangeLog- - Patch #1796569 : Fix FreeBSD FTBFS ./ChangeLog- ./ChangeLog- - Patch #1796575 : fix man1/7za.1 man1/7zr.1 man1/7z.1 ./ChangeLog- ./ChangeLog- (zyx:tmp/image/p7zip_9.13) %


Это единственное упоминание unzip в коде 7-zip.
Спасибо сказали:
Аватара пользователя
zombie
Сообщения: 539
ОС: Ubuntu 10.04 with OpenBox
Контактная информация:

Re: Крякозябры ZIP

Сообщение zombie »

Кстати, узнать эпопею кодировки крякозябр можно тут.
ЛИНУКСФОРУМ ДЛЯ ЛЮДЕЙ | Гугляшечка | Блог
I'm banned by /dev/random with his team.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Крякозябры ZIP

Сообщение ZyX »

zombie писал(а):
22.01.2011 22:49
Кстати, узнать эпопею кодировки крякозябр можно тут.

Вообще-то, если заменить enconv на enca, то вы тоже узнаете, как enconv приводит всё в нормальный вид.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Крякозябры ZIP

Сообщение ZyX »

Кстати, я нашёл, как восстановить русский без LANG=C: 7z l 2xp.zip | iconv -t latin1 | iconv -f ibm866.
Спасибо сказали:
Аватара пользователя
Eronex
Сообщения: 106
ОС: Ubuntu

Re: Крякозябры ZIP

Сообщение Eronex »

ZyX писал(а):
23.01.2011 03:32
Кстати, я нашёл, как восстановить русский без LANG=C: 7z l 2xp.zip | iconv -t latin1 | iconv -f ibm866.
Говорите же скорей :)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: Крякозябры ZIP

Сообщение /dev/random »

Eronex писал(а):
27.01.2011 14:16
ZyX писал(а):
23.01.2011 03:32
Кстати, я нашёл, как восстановить русский без LANG=C: 7z l 2xp.zip | iconv -t latin1 | iconv -f ibm866.
Говорите же скорей :)

Так он сказал. 7z l 2xp.zip | iconv -t latin1 | iconv -f ibm866. Без LANG=C.
Спасибо сказали:
Ответить