주어진 인코딩으로 ZIP 압축 해제


26

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

답변:


22

다음은 인코딩이 무엇인지 아는 한 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
    

    ... 효과가있다.


그리스어 윈도우 내가 만든 지퍼는이 방법의 성공과 인코딩 CP737을 가지고 들어
ndemou

브라보! 맨 페이지를 두 번 확인 했는데 실제로 작동 하지만 완전히 문서화되지 않았 으므로 zsh 완료에는이 매개 변수가 없습니다.
ttimasdf

2
unzipMac OS X에는이 옵션이 없으며 항상 퍼센트 인코딩 된 파일 이름을 생성합니다. @javacom의 unar제안은 매력으로 작용했습니다.
Phil Krylov

데비안 전용 기능처럼 보입니다. 내 unzip말에 따르면 UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spieler그런 옵션을 제공하지 않습니다.
L29Ah

2
@ L29Ah unzipDebian 9의 My 는 완전히 같은 버전이며 그러한 옵션이 없습니다. 아마도 우분투 특정?
Arnie97

11

대부분의 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을 지원 한다는 이점이 있습니다 .)


감사합니다 감사합니다. 나는 현재 OSX에서 테스트 중입니다 (그러나 FreeBSD와 거의 비슷하며 결과는 비슷할 것이라고 생각합니다). 내 질문에 댓글을 달고 여기에서 편집 할 수 없습니다 ...
2ge

1
@ 2ge : 아아, OSX는 실제로 HFS +가 바이트 문자열을 저장하는 대신 파일 이름을 NFD UTF-16으로 강제로 변환하므로 실제로는 다를 수 있습니다. 따라서 변환 할 수 있기 전에 GB18030 이름이 손상 될 수 있습니다.
user1686

원래 질문을 편집하고 의견을 더 추가하십시오.
2ge

예, macOS Sierra에서 시도했으며 bsdtar는 많은 "xxx를 만들지 못했습니다"오류를보고했습니다 (부모 디렉토리 이름이 정확하기 때문). 아카이브를 Linux VPS로 복사하고 압축 해제 -O를 사용하여 압축을 풀고 ssh -C를 사용하여 결과를 내 Mac으로 다시 복사해야합니다.
Chang Qian

10

방법 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

2
당신을 감사의 unar방법은 맥 OS X에서 적어도 대부분의 번거 로움 무료
필 크릴 로프

4

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

brew cask install the-unarchiver

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


4

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

7z x -scs903 some.zip

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


2
7z -scs스위치는 @정의 된 파일 목록 의 인코딩 만 선택 합니다.
Phil Krylov

1

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

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


0

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

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

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


7z를 추천 하는 답변이 있으며 귀하의 답변으로 더 이상 아무것도 추가하지 않습니다.
Melebius 2018 년

1
예, 이제 7z를 추천하는 또 다른 답변 이 있습니다 . 거의 5 개월 후에 게시 된 답변에 "더 추가"하려는 Berry의 답변을 거의 기대할 수 없습니다.
Scott

@Scott 죄송합니다. 영어 월 약어를 올바르게 읽지 못했습니다.
Melebius

확인. 마우스 포인터를 페이지의 임의의 날짜 위에 놓으면 (그리고 그 위에 마우스를 올려 놓으면) 날짜가 숫자로 표시됩니다. (적어도 이것은 컴퓨터에서 작동하며 사람들은 전화에서 제대로 작동하지 않는다고 말합니다.) 또한 질문의 오른쪽 하단 아래에 "가장 오래된 투표"가 표시됩니다. 이것은 답변 정렬 순서입니다. "가장 오래된"을 클릭하면 가장 오래된 것부터 가장 오래된 것까지 순서대로 답변을받습니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.