주어진 인코딩으로 ZIP 압축 해제 해당 파일의

ZIP 파일이 있는데 파일이 포함되어 있으며 파일 이름이 일부 인코딩되어 있습니다. 해당 파일 이름의 인코딩을 알고 있지만 파일 이름을 올바르게 압축 해제하는 방법을 여전히 모른다고 가정 해 봅시다.

여기에 예제 파일 이 있습니다. “【SSK 字幕 组】 뱀파이어 다이어리 吸血鬼 日记 S06E12.ass”파일이 하나 있습니다.

사용한 인코딩이 GB18030 (중국어)이라는 것을 알고 있습니다.

질문은-적절한 인코딩 된 파일 이름을 얻기 위해 unzip 또는 다른 CLI 유틸리티를 사용하여 FreeBSD에서 해당 파일의 압축을 푸는 방법은 무엇입니까? 나는 가능한 모든 것을 시도했지만 결과는 좋지 않았다. 도와주세요.

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!

압축 풀기를 사용하여 비슷한 것을 시도했지만 비슷한 문제가 발생합니다.

고맙습니다. 이제 OSX (터미널)의 SSH를 사용하여 연결하는 FREE BSD를 사용해보십시오.

# 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”를 시도하여 올바른 문자를 보지만 운이 좋지 않습니다. 따라서 적절한 결과를 얻을 수 있는지 확인하기 위해 첫 번째 중국어 로캘을 해결해야한다고 생각합니다. 실제로 비교할 수 있습니다. 이걸로 도와주세요.



답변

다음은 인코딩이 무엇인지 아는 한 Ubuntu 16.04에서 인코딩의 압축을 풀기 위해 수행 한 작업입니다. 널리 사용되는 unzip도구 에만 의존하기 때문에 FreeBSD에서도 동일한 방법을 사용해야합니다 .

  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유닉스 에서 파일을 만들지 않기 때문에 단순히 시도 하고 작동해야합니다 .


따라서 구체적인 예를 들면 다음과 같습니다.

  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
    

    … 효과가있다.


답변

대부분의 POSIX 파일 시스템에서 파일 이름은 일련의 바이트 일 뿐이며 사용자 공간에 따라 다릅니다. 이것을 유리하게 사용할 수 있습니다.

  1. 도구가 파일 이름을 엉망으로 만드는 것처럼 보이기 bsdtar때문에 unzipbsdtar는 원시 파일을 추출하므로 먼저을 사용하여 아카이브를 추출하십시오 . (저는 이것을 Linux에서 테스트하고 tar있습니다. FreeBSD는 그냥 호출한다고 생각합니다 .)

    $ 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 .
    

    (참고 : 나는 GB18030 지원을위한 CPAN에서 인코딩 :: HanExtra를 설치했다 수동으로 추가 use Encode::HanExtra;는 / usr / 빈은 / 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을 지원 한다는 이점이 있습니다 .)


답변

방법 1 : unar 유틸리티 사용

sudo apt-get install unar

unar -e gb18030 gb18030.zip

방법 2 : 파이썬 스크립트를 사용하여 파일 압축 풀기 (참조 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


답변

OS X에서는 The Unarchiver 라는 GUI 응용 프로그램을 사용할 수 있습니다 . Mac App Store 또는 Homebrew Cask를 사용하여 설치할 수 있습니다 .

brew cask install the-unarchiver

ZIP 파일로 ZIP 파일을 열면 응용 프로그램에서 아카이브의 파일 이름 미리보기를 사용하여 적절한 인코딩을 선택할 수 있습니다.



답변

7z는 스위치와 함께 문자셋 ID를 지원합니다 -scs. 예 :

7z x -scs903 some.zip

여기서 903은 中文 簡體 문자셋입니다. 더 긴 문자셋 ID 목록은 여기 에서 찾을 수 있습니다 .


답변

7z를 사용하여 파일 추출

7z x yourfile.zip

그런 다음 해당 파일 이름의 인코딩을 직접 변환하십시오.

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

내 경우에는 from_encoding이 tis-620 (태국어 인코딩)이므로 적절한 언어 인코딩을 찾아야합니다. 일반적으로 인기있는 문제는 문제를 해결하지만 파일 이름을 여전히 읽을 수없는 경우 _encoding에서 windows-1252 또는 shift-jis (일본어)와 같은 다른 항목으로 변경하려고 시도하면 명령을 사용하여 사용 가능한 인코딩을 나열 할 수 있습니다.

convmv --list
iconv --list

이것은 나를 위해 매우 간단한 “해결 방법”입니다.


답변

방금 7zip을 사용했으며 올바른 인코딩을 선택했습니다.

(표준 지퍼로는 할 수 없었던 것)

GUI 도구와 함께 Windows에서 사용했습니다. 명령 줄 7z도 도움이 될 것입니다.