히브리어 이름을 가진 파일의 ZIP 아카이브를 올바르게 압축 해제하는 방법은 무엇입니까?

히브리어 이름을 가진 파일의 ZIP 아카이브를 올바르게 압축 해제하는 방법은 무엇입니까?

누군가 나에게 히브리어 이름의 파일이 포함된 ZIP 파일을 보냈습니다(Windows에서 생성되었으며 어떤 도구가 사용되었는지 확실하지 않음). 저는 Debian Stretch에서 LXDE를 사용하고 있습니다. Gnome Archive Manager가 파일의 압축을 풀었지만 히브리어 문자가 깨졌습니다. 나생각하다UTF-8 옥텟을 유니코드 문자로 확장합니다. 예를 들어 이름에 4개의 문자와 .doc 접미사가 있는 파일이 있는데 문자는 0x008E 0x0087 0x008E 0x0085 입니다. 명령줄 압축 풀기 유틸리티를 사용하는 것은 훨씬 더 나쁩니다. 완전히 압축을 풀기를 거부하고 "잘못되거나 불완전한 멀티바이트 또는 와이드 문자"에 대해 불평합니다.

그래서 내 질문은 다음과 같습니다.

  • 올바른 이름으로 파일의 압축을 풀 수 있는 또 다른 압축 풀기 유틸리티가 있습니까?
  • 파일을 압축하는 방식에 문제가 있습니까, 아니면 단지 ZIP 구현이 호환되지 않는 것입니까? 아니면 Linux ZIP 유틸리티의 잘못된 기능/버그인가요?
  • 잘못된 문자로 압축을 푼 후 올바른 파일 이름을 얻는 방법은 무엇입니까?

답변1

파일 이름이 Windows 독점 코드 페이지(CP862,1255, 등).

  • 올바른 이름으로 파일의 압축을 풀 수 있는 또 다른 압축 풀기 유틸리티가 있습니까?이러한 코드 페이지를 기본적으로 지원하는 zip 유틸리티는 없습니다. 7z에는 인코딩에 대한 지식이 있지만 시스템에 더 일반적으로 알려진 인코딩이어야 하며( LANG환경 변수를 설정하여 선택) Windows 코드 페이지가 여기에 포함되지 않을 수도 있습니다.

    unzip -UU이름에 올바른 바이트가 포함된 파일은 명령줄에서 생성되어야 합니다(모든 유니코드 지원을 비활성화하여). 이것은 아마도 GNOME 도구에서 얻을 수 있는 것일 것입니다. 어느 쪽이든 인코딩이 정확하지 않지만 아래에서 수정할 수 있습니다.

  • 파일을 압축하는 방식에 문제가 있습니까, 아니면 단지 ZIP 구현이 호환되지 않는 것입니까? 아니면 Linux ZIP 유틸리티의 잘못된 기능/버그인가요?귀하가 받은 파일은 휴대용으로 생성되지 않았습니다. 반드시 그렇지는 않습니다잘못된내부 사용의 경우 인코딩은 고정되어 있으며 미리 알려져 있습니다. 단, 형식 사양에는 이름이 UTF-8 또는 cp437이어야 하고 사용자의 이름은 UTF-8이나 cp437이 아니라고 명시되어 있습니다. 다른 코드 페이지를 사용하는 것은 Windows 시스템 간에도 제대로 작동하지 않지만 Windows가 아닌 시스템에는 애초에 이러한 코드 페이지에 대한 개념이 없습니다. 대부분의 도구는 파일 이름을 UTF-8로 인코딩합니다(여전히 문제를 피하기에는 충분하지 않습니다).

  • 잘못된 문자로 압축을 푼 후 올바른 파일 이름을 얻는 방법은 무엇입니까?파일 이름의 인코딩을 식별할 수 있으면 기존 이름의 바이트를 UTF-8로 변환하고 기존 파일을 올바른 이름으로 이동할 수 있습니다.convmv도구기본적으로 프로세스를 단일 명령으로 래핑합니다. 내부의 모든 것을 cp862에서 UTF-8로 convmv -f cp862 -t utf8 -r .변환하려고 시도합니다 ..

    또는 모든 것을 올바른 이름으로 사용 iconv하고 이동할 수 있습니다. find그것은 다음과 같습니다:

    find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp862 -t utf8)"' sh {} \;
    

    현재 디렉토리에서 모든 파일을 찾아 파일 이름을 UTF-8로 변환하려고 시도합니다.

    두 경우 모두 다양한 인코딩을 시도하고 적합한 인코딩을 찾아볼 수 있습니다.


인코딩을 수정한 후 해당 파일을 다른 방향으로 다시 보내려는 경우 상대방에서도 동일한 문제가 발생할 수 있습니다. 이 경우 -UUWindows 측에서는 수정이 어려울 수 있으므로 압축파일을 사용하기 전 과정을 거꾸로 진행하시면 됩니다.

답변2

내 명령이 성공했습니다 7z x <source.zip>.

버전:

p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,[...])

잠재적으로 관련이 있는 환경:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_CTYPE=UTF-8

파일 이름에 8비트 문자가 포함된 모든 파일의 압축을 풀 수 있으며, 그 중 일부는 건너뛰고 일부는 깨졌습니다.

답변3

방금 동일한 문제가 발생했으며 스위치를 지정하면 unzip내 Ubuntu 저장소()에서 사용 가능한 버전이 UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.파일 이름의 자동 디코딩을 처리할 수 있는 것으로 나타났습니다 -a.

unzip -a stupid.zip

답변4

키릴 문자가 포함된 zip 아카이브를 디코딩하는 데 비슷한 문제가 있었습니다. Python 스크립트의 한 줄이 작업을 올바르게 수행합니다.

#!/usr/bin/python

import zipfile
import sys

zipfile.ZipFile(sys.argv[1], 'r').extractall(sys.argv[2] if len(sys.argv) > 2 else '.')

그럼 그냥 unzip_enc전화해unzip_enc ZIP_FILE [TARGET_DIR]

unzip -UU나 에게는 두 환경 변수 unzip -a모두 LANG*아무 소용이 없습니다.

관련 정보