Bug 4871 - Неверная работа с кодировками названий файлов
: Неверная работа с кодировками названий файлов
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/unzip)
: unstable
: all Linux
: P3 major
Assigned To:
:
:
:
:
: 12313 12562
  Show dependency tree
 
Reported: 2004-07-23 18:08 by
Modified: 2016-01-20 00:42 (History)


Attachments
Патч, убирающий перекодировку (721 bytes, patch)
2004-07-23 18:10, Vitaly Lipatov
no flags Details | Diff
unzip-5.50-alt-iconv.patch (12.06 KB, patch)
2004-07-27 08:19, Dmitry Vukolov
no flags Details | Diff
unzip-5.50-alt-iconv-v1.1.patch (13.80 KB, patch)
2004-07-28 00:03, Dmitry Vukolov
no flags Details | Diff
Патч для перекодировки с поддержкой UTF-8 (14.87 KB, patch)
2006-02-23 21:42, m0sia
no flags Details | Diff


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2004-07-23 18:08:43
Введение 
======== 
Программы zip/unzip устарели чрезвычайно. Это видно по их запутанному, 
перегруженному ifdef'ами коду. Плетёшься по нему и спотыкаешься. Несмотря на 
поддержку кучу платформ, эти программы не умеют обращаться с кодировками при 
компилировании в Linux. 
Обмен с внешним миром для пользователей Linux невозможен без архиваторов. 
Проблемы совместимости должны быть сведены к минимуму. Но что мы имеем. 
 
Проблема 
======== 
При распаковке архива, созданного в DOS/Win, названия файлов перекодируются из 
cp866 (кодировка хранения имён при архивации в указанных системах) в 
неизвестно что, поэтому при всём желании кодировку не восстановить уже 
никакими силами. 
 
Предлагается 
============ 
Поскольку в файлах ZIP хранится информация о том, в каких системах они 
созданы, предлагается перекодировать названия в кодировку файловой системы.
------- Comment #1 From 2004-07-23 18:10:38 -------
Created an attachment (id=502) [details]
Патч, убирающий перекодировку

Приложенный патч убирает перекодировку названий в unzip, после чего можно хотя
бы воспользоваться convmv для перекодирования названий.
Было бы замечательно вставить использование iconv, чтобы названия
перекодировались автоматически.
------- Comment #2 From 2004-07-26 00:49:46 -------
(In reply to comment #0)
> При распаковке архива, созданного в DOS/Win, названия файлов перекодируются из 
> cp866 (кодировка хранения имён при архивации в указанных системах) в 
> неизвестно что, поэтому при всём желании кодировку не восстановить уже 
> никакими силами. 

Ну не такое уж это и "неизвестно что" :-) Просто они там избалованы своими
латинскими языками, вот и перекодируют всё из cp850 в cp1252. Работает такой
вариант:

$ unzip -Z1 filename.zip | iconv -f cp1252 -t cp850 | iconv -f cp866

Безобразие, конечно. Надо исправлять. Вопрос в том, как правильно.

Честно говоря, я не совсем понял предложение Виталия по перекодировке.
Как мне кажется, кусок кода, удаляемый патчем, именно и занимается разбором
случаев ОС архива -> кодировка. Другое дело, что сейчас исходная и
результирующая кодировки жестко забиты (850/1252 и наоборот?!). 
Можно поступить немного лучше авторов unzip и переопределить макросы _OEM_INTERN
как cp866->локаль и _ISO_INTERN как cpххх->локаль. Либо пойти дальше и добавить
переменные окружения / ключ, которые бы указывали исходные кодировки имён файлов
в архивах.
------- Comment #3 From 2004-07-26 01:14:42 -------
Да, именно так и надо сделать. Приложенный мной патч просто показывал место 
решения проблемы (я, например, его достаточно долго искал). Правда для 
соответствия кодировок в DOS/Unix наверное придётся таблицу составить, чтобы 
сделать и для украинских и белорусский локалей. 
------- Comment #4 From 2004-07-27 08:17:28 -------
Предлагаю на рассмотрение следующий патч.
Добавлены ключи -O и -I, задающие кодировку имён файлов в архивах DOS/Windows и
всех остальных ОС соответственно. По умолчанию для совместимости установлены
CP850 и CP1252. Однако, имена файлов перекодируются лишь в случае полностью
безошибочной работы iconv(). Поскольку из CP850/1252 в кириллическую локаль
конвертировать пока ещё никто не научился, то для кириллицы перекодировка по
умолчанию отсутствует.
Возможно, имеет смысл совсем отбросить совместимость и убрать попытки
перекодировки CP850/1252 -> локаль. Что скажете?

В пакет можно также положить /etc/profile.d/unzip.sh примерно такого содержания:
# Set default encoding for filenames inside DOS/Windows Zip archives
export UNZIP="-O CP866"
export ZIPINFO="-O CP866"

К сожалению, авторы unzip изначально не предусматривали свои многочисленные
макросы для преобразования имён файлов из/в многобайтные кодировки. Поэтому для
работы в UTF-8 локали это хозяйство, скорее всего, не годится.
------- Comment #5 From 2004-07-27 08:19:03 -------
Created an attachment (id=531) [details]
unzip-5.50-alt-iconv.patch
------- Comment #6 From 2004-07-27 09:40:56 -------
Я бы всё-таки составил таблицу зависимости кодировки в DOS в зависимости от 
текущей локали. 
cp1252 cp850 
iso8859-1 cp850 или как там 
cp1251 cp866  
koi8-r cp866 
koi8-u cp866 
и т.д. 
unzip должен корректно работать в 
1. командной строке 
2. ark 
3. mc 
не требуя особых настроек для этого. 
Разархивирование - тривиальная операция, и должна выполняться без напряжения. 
------- Comment #7 From 2004-07-28 00:03:10 -------
Created an attachment (id=532) [details]
unzip-5.50-alt-iconv-v1.1.patch

Теперь понял, что вы имели в виду под таблицей. Цепляю новый патч.
------- Comment #8 From 2004-07-28 13:20:35 -------
Здорово. А люди столько лет мучались... 
(Я проверил, вроде действительно всё нормально) 
Теперь бы ещё для zip такой патч написать, 
чтобы созданные в Linux архивы читались в DOS/Win. 
------- Comment #9 From 2004-08-09 19:00:29 -------
Сформулирую задачи:
1. Обеспечить переносимость ZIP архивов, содержащих файлы с кириллические
именами, между OC DOS/Windows и Linux.
2. Обеспечить переносимость ZIP архивов, созданных в Linux с различными
кодировками локали.

Формат ZIP официально поддерживает лишь имена файлов в кодировке ISO8859-1 и
информацию о кодировке не предусматривает. На практике линуксовые ZIP архивы
создаются в кодировке текущей локали, а DOS/Windows архивы -- в кодировке OEM
CP850/866/...

Что касается переносимости, то фактически на данный момент большинство
архиваторов для Windows, и в том числе встроенный в Windows XP, рассматривают
все архивы, вне зависимости от ОС, где они были созданы, как хранящие имена
файлов в кодировке OEM. Исключениями являются Info-Zip Wiz и 7-zip, которые
оставляют имена файлов в Linux-архивах без перекодировки (таким образом
корректно отображаются кириллические Linux-архивы, созданные, например, в локали
ru_RU.CP1251).

Получается, что для решения пункта No.1 надо создавать Linux-архивы в CP850/866,
что в принципе не запрещено, как если бы у пользователя была установлена
соответствующая кодировка локали. А что касается пункта No.2, то unzip'у
остаётся только прикрутить автоугадывание кириллических кодировок для
Linux-архивов, иных вариантов я не пока вижу.
------- Comment #10 From 2004-12-14 14:29:50 -------
patch (v1.1) applied in 5.50-alt4.

thanks :)
------- Comment #11 From 2005-12-05 01:16:16 -------
Можно пока прикрыть, но решение к сожалению не универсальное. Буду думать. 
------- Comment #12 From 2006-02-23 21:42:36 -------
Created an attachment (id=1402) [details]
Патч для перекодировки с поддержкой UTF-8

состряпал для себя патч для перекодировки в UTF-8 локаль.
------- Comment #13 From 2007-01-20 15:18:56 -------
(In reply to comment #12)
> Created an attachment (id=1402) [edit] [details]
> Патч для перекодировки с поддержкой UTF-8
> состряпал для себя патч для перекодировки в UTF-8 локаль.

Хорошо было бы найти патч для zip.
Чтобы можно было аод Linux с русской локалью UTF-8 паковать архивы ZIP с русскими именами, которые 
корректно бы читались в Windows.
------- Comment #14 From 2007-08-14 18:50:55 -------
для unzip FIXED (#12313), для zip -- NEW (#12562)
------- Comment #15 From 2008-09-11 09:39:47 -------
Окончательный патч с использованием natspec можно найти в пакете
http://sisyphus.ru/srpm/Sisyphus/unzip/patches
------- Comment #16 From 2008-09-11 21:36:41 -------
Спасибо!
------- Comment #17 From 2016-01-19 16:56:15 -------
извините, что здесь спрашиваю.
А где есть информация, какими перекодировками можно распаковать современные
zip-файлы? С использованием natspec или без него / с enca / без enca. Как
угодно!
А?
------- Comment #18 From 2016-01-19 21:43:14 -------
(В ответ на комментарий №17)
> А где есть информация, какими перекодировками можно распаковать современные
> zip-файлы?
Возможно, такой вопрос когда-то и привёл к enconvmv из одноименного пакета.
------- Comment #19 From 2016-01-20 00:42:41 -------
(В ответ на комментарий №17)
> извините, что здесь спрашиваю.
> А где есть информация, какими перекодировками можно распаковать современные
> zip-файлы? С использованием natspec или без него / с enca / без enca. Как
> угодно!
Современные zip-файлы должны паковаться с использованием UTF-8, и тот же 7z
должен успешно их распаковывать.