15

Я получил ZIP-файл (ы), который содержит файлы, имена файлов в какой-то кодировке. Допустим, я знаю кодировку этих имен файлов, но я все еще не знаю, как правильно распаковать их.

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

Я знаю, что используется кодировка GB18030 (китайский)

Вопрос - как распаковать этот файл во FreeBSD с помощью unzip или другой утилиты 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", чтобы увидеть правильные символы, но не удачу. Поэтому я думаю, что мне нужно решить первую китайскую локаль, чтобы проверить, когда я получу правильный результат, на самом деле я могу сравнить его. Можете ли вы помочь мне, пожалуйста, с этим?

7 ответов7

14

Вот что я делаю в 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
    

    ... оно работает.

9

В большинстве файловых систем 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.)

4

На OS X вы можете использовать приложение с графическим интерфейсом под названием Unarchiver. Его можно установить с помощью Mac App Store или Homebrew Cask:

brew cask install the-unarchiver

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

4

Способ 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 字幕 组】 Дневники вампира 吸血鬼 日记 S06E12 【SSK 字幕 组】 Дневники вампира 吸血鬼 日记 S06E12/【SSK 字幕 组】 Дневники вампира 吸血鬼 日记 S06E12.ass

2

7z поддерживает идентификатор набора символов с ключом -scs , например:

7z x -scs903 some.zip

где 903 - это кодировка Более длинный список идентификаторов кодировки можно найти здесь.

1

Используйте 7z, чтобы извлечь файл

7z x yourfile.zip

После этого преобразуйте кодировку этих имен самостоятельно:

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

Это работает для меня .. В моем случае, из_encoding - это tis-620 (тайская кодировка), вам нужно найти соответствующую кодировку вашего языка. Популярный обычно решает проблему, но если имя файла по-прежнему нечитаемо, попробуйте изменить от -encoding к другим вещам, таким как windows-1252 или shift-jis (японский) или что-то еще, вы можете перечислить доступную кодировку, используя команду:

convmv --list
iconv --list

Это очень простой метод "как решить" для меня.

0

Я просто использовал 7zip, и ему удалось выбрать правильную кодировку.

(то, что не мог сделать стандартный почтовый индекс)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .