розпакувати ZIP із заданим кодуванням


26

Я отримав ZIP-файли (файли), які містять файли, імена файлів яких є в кодуванні. Скажімо, я знаю кодування цих імен файлів, але я все ще не знаю, як правильно їх розпакувати.

Ось приклад файлу , він містить один файл "【SSK 字幕 组】 Щоденники вампіра 吸血鬼 日记 S06E12.ass"

Я знаю, що використовується кодування GB18030 (китайська)

Питання - як розпакувати цей файл у FreeBSD за допомогою розпакування або іншої утиліти CLI, щоб отримати належне закодоване ім'я файлу? Я спробував усе, що міг, але результат ніколи не був хорошим. Будь ласка, допоможіть.

Я спробував на OSX:

MBP1:test 2ge$ bsdtar xf gb18030.zip
MBP1:test 2ge$ ls
%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12/      gb18030.zip
MBP1:test 2ge$ cd %A1%BESSK%D7%D6Ļ%D7顿The\ Vampire\ Diaries\ %CE%FCѪ%B9%ED%C8ռ%C7S06E12/
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ ls
%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12.ass*
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ find . | iconv -f gb18030 -t utf-8
.
./%A1%BESSK%D7%D6L抬%D7椤縏he Vampire Diaries %CE%FC血%B9%ED%C8占%C7S06E12.ass 
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ convmv -r -f gb18030 -t utf-8 --notest .
Skipping, already UTF-8: ./%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12.ass
Ready!

Я спробував подібне з unzip, але я отримав подібну проблему.

Дякую, зараз пробую БЕЗКОШТОВНУ BSD, де я підключаюсь за допомогою SSH від OSX (терміналу):

# locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=C

Перше, що я хотів би - це правильно показати китайські імена. Я змінився

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

Потім я завантажив файл і спробую "ls", щоб побачити належні символи, але не удачу. Тому я думаю, що я маю вирішити перший китайський локал, щоб перевірити, коли я отримаю належний результат, насправді я можу порівняти його. Чи можете ви також мені допомогти, будь ласка, з цим?

Відповіді:


22

Ось що я роблю в Ubuntu 16.04, щоб розпакувати zip у будь-якому кодуванні, доки я знаю, що таке кодування. Цей же метод повинен працювати і на FreeBSD, оскільки він покладається лише на широко доступний unzipінструмент.

  1. Я ще раз перевіряю точну назву кодування, щоб не помилитися з нею: https://www.iana.org/assignments/character-sets/character-sets.xhtml

  2. Я просто бігаю

    $ unzip -O <encoding> <filename> -d <target_dir>
    

    або

    $ unzip -I <encoding> <filename> -d <target_dir>
    

    вибір між -Oабо -Iзгідно інструкцій тут:

    $ unzip -h
    UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
      ...
      -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
      -I CHARSET  specify a character encoding for UNIX and other archives
      ...
    

    це означає, що я просто намагаюся, -Oі це повинно працювати, тому що не багато людей створить .zipфайл в Unix ...


Отже, для вашого конкретного прикладу:

  1. Точне ім'я кодування GB18030.

  2. Я використовую -Oпрапор і:

    $ unzip -O GB18030 gb18030.zip -d target_dir
    Archive:  gb18030.zip
       creating: target_dir/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/
      inflating: target_dir/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12.ass
    

    ... це працює.


Для блискавок, створених грецькою Windows, я мав успіх із цим методом та кодуванням CP737
ndemou

Браво! Я двічі перевірив man-сторінку, вона насправді працює, але абсолютно недокументована, жоден zsh завершення не має цього параметра.
ttimasdf

3
unzipне має цієї опції в Mac OS X і завжди створює файли, кодовані у відсотках. Пропозиція @ javacom unarпрацювала як шарм.
Філ Крилов

Схоже на функціонал Debian. Мої unzipкажуть, що це UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielerі не надає таких варіантів.
L29Ah

2
@ L29Ah My unzipв Debian 9 точно та сама версія і не має таких варіантів. Можливо, Ubuntu специфічний?
Арніе97

11

У більшості файлових систем POSIX ім'я файлу - це лише декілька байтів, і це має сенс для користувача. Ви можете використовувати це на свою користь.

  1. По-перше, витягніть архів за допомогою bsdtar, оскільки unzipінструмент, схоже, маніпулює іменами файлів, тоді як bsdtar буде витягувати їх у сирому вигляді. (Я тестую це на Linux. Я думаю, FreeBSD просто називає це tar.)

    $ bsdtar xf gb18030.zip
    
  2. Переконайтеся, що такі інструменти iconvможуть успішно декодувати імена:

    $ find . | iconv -f gb18030 -t utf-8
    

    (Зверніть увагу, що це впливає лише на findвихід, а не на самі файли.)

  3. Нарешті використовуйте convmvдля перетворення імен файлів у UTF-8:

    $ convmv -r -f gb18030 -t utf-8 --notest .
    

    (Примітка: мені довелося встановити Encode :: HanExtra з CPAN для підтримки GB18030 і вручну додати use Encode::HanExtra;до / usr / bin / convmv, навіть якщо це передбачається

  4. У випадку, якщо convmvвін недоступний, скриптуйте його:

    $ find . -depth | while read -r old; do
        old=./$old;
        head=${old%/*};
        tail=${old##*/};
        new=$head/$(echo "$tail" | iconv -f gb18030 -t utf-8);
        [ "$old" = "$new" ] || mv "$old" "$new";
    done
    

    (Принаймні, в Linux це перевага в тому, що iconvвоно майже завжди доступне, і він завжди підтримує gb18030.)


дякуємо гравітації, що вивчає це. Я зараз тестую OSX (але це дуже близько до FreeBSD, і я думаю, що результат буде подібний). додаючи коментар на моє запитання, не може змінити тут ...
2Ge

1
@ 2ge: Ах, OSX насправді може бути зовсім іншим, оскільки HFS + внутрішньо змушує імена файлів у NFD UTF-16, а не зберігати бітестринги, тому існує можливість, що він зіпсує імена GB18030, перш ніж ви отримаєте шанс їх конвертувати.
користувач1686

Я редагував оригінальне запитання, додав ще кілька коментарів.
2ге

Так, я спробував це на macOS Sierra, і bsdtar повідомив про багато помилок "Не вдалося створити ххх" (оскільки імена батьківських каталогів є корруптом). Довелося скопіювати мій архів у Linux VPS, скопіюйте-распакуйте його, щоб витягнути його, і скопіюйте результат назад на мій Mac за допомогою ssh -C.
Чан Цянь

10

Спосіб 1 : використання утиліти unar

sudo apt-get install unar

unar -e gb18030 gb18030.zip

Спосіб 2 : Використовуйте сценарій python для розпакування файлу (посилання https://gist.github.com/usunyu/dfc6e56af6e6caab8018bef4c3f3d452#file-gbk-unzip-py )

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# unzip-gbk.py

import os
import sys
import zipfile
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--encoding", help="encoding for filename, default gbk")
parser.add_argument("-l", help="list filenames in zipfile, do not unzip", action="store_true")
parser.add_argument("file", help="process file.zip")
args = parser.parse_args()
print "Processing File " + args.file

file=zipfile.ZipFile(args.file,"r");
if args.encoding:
    print "Encoding " + args.encoding
for name in file.namelist():
    if args.encoding:
        utf8name=name.decode(args.encoding)
    else:
        utf8name=name.decode('gbk')
    pathname = os.path.dirname(utf8name)
    if args.l:
        print "Filename " + utf8name
    else:
        print "Extracting " + utf8name
        if not os.path.exists(pathname) and pathname!= "":
            os.makedirs(pathname)
        data = file.read(name)
        if not os.path.exists(utf8name):
            fo = open(utf8name, "w")
            fo.write(data)
            fo.close
file.close()

Приклад gb18030.zip витягне наступний файл

【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12
【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12.ass

2
Дякую, unarметод є найпростішим, принаймні, на Mac OS X.
Філ Крилов

4

В OS X можна використовувати програму GUI під назвою Unarchiver . Його можна встановити за допомогою Mac App Store або Homebrew Cask :

brew cask install the-unarchiver

Коли ви відкриєте ZIP-файл за допомогою нього, програма дозволяє вибрати відповідне кодування за допомогою попереднього перегляду імені файлу з архіву.


4

7z підтримує ідентифікатор діаграми з комутатором -scs, наприклад:

7z x -scs903 some.zip

де 903 - 中文 簡體 charset. Більш довгий список ідентифікаторів шаблону можна знайти тут .


2
7z -scsПеремикач вибирає лише кодування визначеного @списку файлів.
Філ Крилов

1

Витягніть файл 7z

7z x yourfile.zip

Після цього перетворіть кодування цих імен файлів самостійно:

convmv --notest -f from_encoding -t utf-8 -r your_extracted_folder/

Це працює для мене .. from_encoding в моєму випадку - tis-620 (це тайське кодування), вам потрібно знайти відповідне кодування для вашої мови. Популярний зазвичай вирішує проблему, але якщо ім'я файлу все ще не читається, то спробуйте змінити з_кодування на інші речі, такі як Windows-1252 або shift-jis (японська) або будь-що інше, ви можете перерахувати доступне кодування за допомогою команди:

convmv --list
iconv --list

Це дуже простий метод "як вирішити" для мене.


0

Я просто використав 7zip, і йому вдалося вибрати правильне кодування.

(те, що стандартний поштовий індекс не міг зробити)

але використовується в Windows, за допомогою інструменту GUI. Можливо, командний рядок 7z теж підійде для вас.


Є відповідь, яка рекомендує 7z, і ваша відповідь нічого більше не додає.
Мелебіус

1
Так, є в даний час ще одна відповідь рекомендувати 7z. Навряд чи можна очікувати відповіді Беррі на те, щоб «додати більше» до відповіді, яка була опублікована майже через п’ять місяців.
Скотт

@Scott Мої вибачення, мені не вдалося правильно прочитати англійські абревіатури місячних.
Мелебій

ДОБРЕ. Можливо, ви захочете знати, що якщо ви наведіть вказівник миші на будь-яку дату на сторінці (і “наведіть” на неї), вона покаже вам дату як цифри. (Принаймні, це працює на комп’ютерах; люди кажуть, що це не добре працює на телефонах.) Також, у нижньому правому куті питання, ви побачите "активні найстаріші голоси". Це порядок сортування відповідей. Якщо ви натиснете на "найстаріший", то ви отримаєте відповіді в порядку від найдавнішого до найновішого.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.