LINUX.ORG.RU

Распаковка zip-архива с русскими именами файлов

 , ,


3

1

Не думал, что столкнусь с такой проблемой в 2022 году, но вот столкнулся. Я конечно не совсем беспомощный и нагуглил даже 2 решения этой проблемы и смог решить проблему на своей домашней тачке(Gentoo).

Мои способы:

unzip -O CP866 -l ./ARCHIVE.zip

7z l -no-utf16 ./ARCHIVE.zip | iconv -f cp866

Во втором варианте задумывалось переименование после распаковки.

Но проблема в том, что решить надо не на сферическом линуксе в вакууме, где можно поставить патченный пакет или прибегнуть к разным другим ухищрениям, а на ванильном Debian 11. На котором пакет p7zip не имеет ключа -no-utf16, а unzip не имеет -О в параметрах командной строки.

Пока что вижу вариант установить патченный unzip из ppa от убунты(криво как-то мне кажется ставить на прод софт из ppa от Васяна) или написать скрипт на питоне, который будет перекодировать имена файлов при распаковке(если честно, то лень, да и питон я знаю не очень).

Всезнающий ЛОР, подскажи, что можно сделать в такой ситуации?

★★★★★

Последнее исправление: Loki13 (всего исправлений: 1)

Затарить исходный объект?

mexx
()

взять архиватор умеющий в утф.
на целевом ванильном дебиане мож и файловая система в ванильной «не утф» кодировке :)

васян может быть наиболее правильнодумающим элементом в ванильной чистоте…
тебе шашечки или кататцо ??

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 3)
Ответ на: комментарий от pfg

Архивы даны нам свыше. Я их не готовлю, а только использую.

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Extraterrestrial

Из исходников не сказал бы что красивое решение. Но на крайний случай придется.

Хотя, вот вроде нашел решение. Причем на ЛОРе в теме из похожих от 2007го года.

[code=Bash]

#!/bin/sh

7z x ../archive.zip

convmv -r -f cp866 -t utf-8 –notest *

[/code]

PS: Что случилось с LORCODE и почему не работает [code][/code]?

Loki13 ★★★★★
() автор топика
Последнее исправление: Loki13 (всего исправлений: 7)
Ответ на: комментарий от Loki13

Поменяй разметку с Markdown на LORCODE в настройках профиля или при написании комментария.


#!/bin/sh

7z x ../archive.zip

convmv -r -f cp866 -t utf-8 –notest *

Extraterrestrial ★★★★★
()
Последнее исправление: Extraterrestrial (всего исправлений: 1)

Самое простое это dosbox

sparks ★★★★
()
Ответ на: комментарий от Extraterrestrial
#!/bin/sh

7z x ../archive.zip
convmv -r -f cp866 -t utf-8 --notest *

Ага, спасибо, получилось. Раньше(год назад может) причем работало и так. Видимо что-то поменяли в движке.

Loki13 ★★★★★
() автор топика
Последнее исправление: Loki13 (всего исправлений: 2)
Ответ на: комментарий от AEP
bsdtar: Pathname cannot be converted from cp850 to current locale.
bsdtar: Archive entry has empty or unreadable filename ... skipping.

То что cp850 не обращайте внимания, в этом архиве файлы с заподноевропейской кодировкой.

PS: А я уж обрадовался, что без самописного скрипта(выложу в эту тему после отладки, вдруг кому пригодится) обойдусь

PPS: При этом uchardet работает на этом имени файла корректно

Loki13 ★★★★★
() автор топика
Последнее исправление: Loki13 (всего исправлений: 3)

Изредка попадаются, делаю так unar -e IBM866 /путь к файлу

KOV ★★
()
Ответ на: комментарий от Loki13

cp850 - это кодировка по умолчанию в zip-архивах, созданных под DOS или под старыми версиями Windows в США и западной Европе.

P.S. А что именно находит uchardet после распаковки через 7z?

P.P.S. unar содержит детектор кодировок, и он включен по умолчанию. Если в вашем дистрибутиве есть unar, то можно его тоже попробовать без всяких опций.

AEP ★★★★★
()
Последнее исправление: AEP (всего исправлений: 1)

Попробуй unar. Я с его помощью распаковывал zip с cp936. Есть в репах дебиана.

unar -e cp936 file.zip
Radjah ★★★★★
()
Ответ на: комментарий от grem

Так у меня на генте всё нормально, мне на ванильном Debian 11 надо.

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от AEP

А что именно находит uchardet после распаковки через 7z?

iso8859-2

А после переименования помощью iconv - utf-8

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Radjah

Да, с ключом -e сработало. Ещё один вариант будет на рассмотрение. Отличный вариант, у него только минус, что

After this operation, 16.8 MB of additional disk space will be used.

Не 50Мб конечно, которые convmv хочет, но тоже не 200Кб со скриптом. Но 17Мб уже есть о чем подумать.

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Loki13

Ну да, хрени всякой много с собой тянет.

Я просто сам в своё время с такой проблемой столкнулся. Правильный результат только unar выдал. 7z выдавал зюзики вместо иероглифов.

Есть ещё вариант, что я неправильно 7zip готовил, и он может сразу правильно кодировку выставлять.

Radjah ★★★★★
()
Ответ на: комментарий от Radjah

Есть ещё вариант, что я неправильно 7zip готовил, и он может сразу правильно кодировку выставлять.

Не, такого вроде у него нет. Есть -no-utf16, но после всё равно нужно прогонять iconv или convmv.

Интересное, кстати, поведение у консольных утилит. ls выдает экранированные коды, а ls | grep выдает уже корректные буквы. И это на одном и том же имени файла. Ключа ls, чтобы писал умляуты я не нашел.

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Loki13

iso8859-2

Соответственно, в качестве исходной кодировки (hdrcharset) ее и надо указывать. Вот только странно это. В zip по историческим причинам кодировки DOS-овские, а в DOS iso8859-2 никогда не использовалась. В тех же странах (например, в Чехии) была cp852.

AEP ★★★★★
()
Ответ на: комментарий от AEP

Да, у меня работает в convmv и в iconv с cp850. И это правильно. Думаю просто uchardet немного подглючивает при определении. Но мне это не очень важно, я его использую для проверки нужно ли переименовывать, чтобы не переименовать повторно. Поэтому мне важно только utf8 или не-utf8.

в качестве исходной кодировки (hdrcharset) ее и надо указывать

Такая же ошибка, если указать в исходной кодировке ее.

Loki13 ★★★★★
() автор топика
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от Loki13

Давай таки разберемся. Может, проблема совсем в другом месте. Или у тебя какой-то редкий вариант проблемы.

Вот тебе еще один старый zip-архив, внутри которого есть файл с русским именем: https://dek-kamen.ru/wp-content/uploads/2019/04/Prajjs-obshhijj.zip

Там внутри точно cp866. Работает ли bsdtar --options hdrcharset=cp866 на нем в твоей системе?

AEP ★★★★★
()
Ответ на: комментарий от AEP
root@virtual:~# cd /home/unzip & bsdtar --options hdrcharset=cp866 -xvf /home/Prajjs-obshhijj.zip 
[1] 3070442
bsdtar: Failed to set default locale
bsdtar: Pathname cannot be converted from cp866 to current locale.
bsdtar: Archive entry has empty or unreadable filename ... skipping.
bsdtar: Error exit delayed from previous errors.
[1]+  Done                    cd /home/unzip
Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Loki13

Собственно, у тебя проблема с локалью, как будто она не до конца создана или криво настроена.

Посмотри, что в /etc/locale.gen. Если этих строчек нет, добавь:

en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8

После этого запусти утилиту locale-gen без параметров.

После этого тест с bsdtar должен пройти. Если не проходит, покажи вывод команды locale.

AEP ★★★★★
()
Последнее исправление: AEP (всего исправлений: 2)
Ответ на: комментарий от AEP

Да, скорее всего так. Но это даже менее важно, чем то, что я с помощью твоего архива нашел баг в своем скрипте. Причем всё работало, по причине четного количества ошибок :) Так что премного благодарен.

Loki13 ★★★★★
() автор топика
26 марта 2024 г.

Спасибо, друг! Это был лучший ответ!

у меня это работает так:

unzip -O CP1251 -I UTF8 архив.zip

Жму руку!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.