Проблема кодировки символов Zipfile

588
Misaki

ПРИМЕЧАНИЕ. Этот вопрос отличается от распаковки ZIP с заданной кодировкой, поскольку ни одно из этих решений не работает, и я не уверен, что правильно функционирующая программа распаковки может даже получить правильное имя файла.

Существует zip-файл с именем файла символов японского языка. unzipможет указывать кодировки символов, которые обычно работают для получения правильных имен файлов. (В моем дистрибутиве его нет на странице manили infoдля распаковки, но в выводе справки исполняемого файла.)

Но это не работает для некоторых zip-файлов, включая этот. Это коллекция файлов для анимационной программы MikuMikuDance. Некоторые файлы имеют «мусорное» имя файла при использовании с unzip -O sjis -l archive.zipили при распаковке с помощью file-roller.

Другой файл в архиве ссылается на имена мусорных файлов, хотя он относится к кодировке имени Shift-JIS, а не к UTF8. Он пытается загрузить эти файлы, поэтому, если они названы неправильно, они не могут загрузить. Вопрос здесь заключается в том, является ли zip-файл таким, чтобы правильные имена файлов могли быть извлечены другой программой, и были ли они правильно названы в системе загрузчика.

Желаемое имя файла: «Figure_ そ の 他 .fx» («other» на японском языке). Похоже, что в zip-файле есть два разных представления, одно из которых « », что означает SJIS, интерпретируемый как UTF8, а в других местах - U + 0082 и некоторые тайские символы:

grep binary file Эта вторая версия является выводом из unzip, с или без -O sjisопции. Кажется, нет никакого способа преобразовать это обратно в исходное имя файла.

Оригинальный zip-файл можно скачать здесь (25 МБ), а его содержимое можно открыть с помощью бесплатной программы MikuMikuDance, хотя для MikuMikuEffect используется файл «.fx», для работы которого требуется несколько собственных библиотек в Wine. Но, возможно, кто-то может ответить на этот вопрос без zip-файла.

Хранят ли zip-файлы альтернативное имя файла, которое обычно не используется? Отображаются ли обратные слэши в виде знаков иены на японских компьютерах, так или иначе связанных с тем, что имя файла не используется? Если вы возьмете строку, которая отображается как «Normalmap Effect \ Skin \ Figure_ ̑ .fx», и передадите ее по конвейеру iconv -f sjis -t utf8, вы получите «Normalmap Effect ¥ Skin ¥ Figure_ そ の 他 .fx». Википедия говорит о «дополнительном поле»; это используется для хранения и извлечения «плохого» имени файла?

1
Не существует формальной спецификации для кодировки, используемой для кодирования записей в zip-файле. Ignacio Vazquez-Abrams 5 лет назад 0
Возможный дубликат [распаковать ZIP с заданной кодировкой] (https://superuser.com/questions/872596/decompress-zip-with-given-encoding) JakeGould 5 лет назад 0
Решение - как было предложено в [посте, в котором я соединил это] (https://superuser.com/questions/872596/decompress-zip-with-given-encoding) - использовать 7-Zip или Unrar вместо простого старый почтовый индекс JakeGould 5 лет назад 0
Это определенно не дубликат этого поста. Я упоминаю главный ответ на этот вопрос в первом абзаце. В другом ответе упоминается выбор кодировки 7z; `для меня в ; do 7z l -scs $ i 'archive.zip' | grep そ の 他; echo $ i; done` ничего не возвращает для i <3000, хотя существует множество идентификаторов выше 3000. Misaki 5 лет назад 0
Я получаю тот же отрицательный результат для другого zip-файла, у которого есть имена файлов, которые распознаются `unzip -O sjis -l archive.zip`, поэтому я делаю это неправильно или он не работает. (И grep; echo $ i изменено на &&.) Misaki 5 лет назад 0
Zip-файлы _do_ иногда имеют отдельное поле для «имени файла Unicode» (стиль InfoZip). grawity 5 лет назад 0
Таким образом, программа сжатия интерпретировала SJIS как iso8859-11 или что-то очень похожее, один из байтов был каким-то образом изменен в процессе, этот неверный результат был сохранен как «имя файла Unicode», а программы распаковки используют неправильный результат. Правильное «неправильное» имя файла, как iso8859-11 будет «But ", но в zipfile это" Figure_ฬ 'ผ. FX». Misaki 5 лет назад 0
Не по теме, но как произошло SJIS> iso8859-11 (или, может быть, TIS-620)? Предполагает ли программа упаковки, что ввод был в кодировке системы, которая была тайской? Это предположение было неверным, потому что тайское кодирование не имеет японских символов; Было ли японское имя файла сохранено на диске как SJIS, или операционная система считала имя файла UTF8 с диска, преобразовала его в SJIS в памяти для доступа программ и передала последовательность байтов SJIS в программу упаковки? Программа, использующая файл, автоматически загружает его только в Linux / Wine, если для переменной LANG установлено значение ja_JP.UTF8; похоже на винду? Misaki 5 лет назад 0

2 ответа на вопрос

3
Y Treehugger Cymru

Я только что проверил это для себя, используя предоставленную вами ссылку, и скачал файл, озаглавленный Thank You For You Project.zip, который мне пришлось распаковать, используя пароль 864 с 7-zip, и не обнаружил никаких проблем. У меня был правильный файл?

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (https://chat.stackexchange.com/rooms/77060/discussion-on-answer-by-y-treehugger-cymru-zipfile-character-encoding-challenge). DavidPostill 5 лет назад 0
0
Misaki

Обратная косая черта, отображаемая в виде знаков иены, не связана. Второе имя файла - это имя файла UTF-8, как описано в разделах 4.5, 4.6 и Приложении D спецификации .ZIP .

В данном конкретном случае имя файла было передано программе упаковки в Shift-JIS, но программа упаковки упаковок предположила, что это ISO-8859-11 или TIS-620 (тайские кодировки). Предполагалось, что один из байтов ввода был преобразован или преобразован в другой символ в Unicode, что препятствует восстановлению правильного имени файла.

Когда используется дополнительное поле Info-ZIP Unicode Path, такие программы, как 7z или Info-ZIP, unzipпредполагают, что оно допустимо, и игнорируют поле основного имени файла и -Oпараметр, используемый unzipдля установки исходной кодировки символов.

Сопровождающие программы, вероятно, приветствуют патч, который добавляет опцию для отмены этого поведения.

Похожие вопросы