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에서도 동일한 방법을 사용해야합니다 .
-
철자가 틀리지 않도록 인코딩의 정확한 이름을 다시 확인하십시오 : https://www.iana.org/assignments/character-sets/character-sets.xhtml
-
나는 단순히 달리다
$ 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
유닉스 에서 파일을 만들지 않기 때문에 단순히 시도 하고 작동해야합니다 .
따라서 구체적인 예를 들면 다음과 같습니다.
-
정확한 인코딩 이름은
GB18030
입니다. -
나는
-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 파일 시스템에서 파일 이름은 일련의 바이트 일 뿐이며 사용자 공간에 따라 다릅니다. 이것을 유리하게 사용할 수 있습니다.
-
도구가 파일 이름을 엉망으로 만드는 것처럼 보이기
bsdtar
때문에unzip
bsdtar는 원시 파일을 추출하므로 먼저을 사용하여 아카이브를 추출하십시오 . (저는 이것을 Linux에서 테스트하고tar
있습니다. FreeBSD는 그냥 호출한다고 생각합니다 .)$ bsdtar xf gb18030.zip
-
다음과 같은 도구
iconv
가 이름을 성공적으로 디코딩 할 수 있는지 확인하십시오 .$ find . | iconv -f gb18030 -t utf-8
(이것은
find
파일 자체가 아니라 출력 에만 영향을 미칩니다 .) -
마지막으로
convmv
파일 이름을 UTF-8로 변환하는 데 사용하십시오.$ convmv -r -f gb18030 -t utf-8 --notest .
(참고 : 나는 GB18030 지원을위한 CPAN에서 인코딩 :: HanExtra를 설치했다 및 수동으로 추가
use Encode::HanExtra;
는 / usr / 빈은 / convmv 돼있 할지라도 -
경우에
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
답변
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도 도움이 될 것입니다.