zip 파일의 키릴 문자 파일 이름 인코딩

zip 파일의 키릴 문자 파일 이름 인코딩

zip 파일의 스트림으로 저장된 파일 이름의 비ASCII 문자와 관련된 몇 가지 문제가 있습니다(헤브라이 사람,중국인,일본어든 한국어든). 그러나 제공된 솔루션 중 어느 것도 Windows 컴퓨터에서 키릴 문자가 포함된 zip 파일을 처리하는 데 도움이 되지 않았습니다.

파일 자체에는 키릴 문자 이름(코스모스.zip- 다운로드 가능한 링크). 이는 설명 목적으로만 길이가 0인 콘텐츠의 아카이브입니다.

unzip -l인쇄:

Archive:  Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   ɫ���߼��/ict_inf.pdf
---------                     -------
        0                     1 file

Ugly는 ɫ���߼��일련의 바이트를 나타냅니다 C9 AB DF E8 AB DF BC AB DF.

나는 (Gmail 미리보기 기능을 사용하여) 이것이 되어야 한다는 것을 알고 있습니다.

Archive:  Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

이것이 우리가 매핑해야 하는 것 C9 AB DF E8 AB DF BC AB DF입니다 РосКосмос.

일반적으로 사용되는 8비트 키릴 문자 인코딩에는 CP1251, CP866, ISO8859-5 등이 있지만 이들은 이 단어를 다른 바이트 시퀀스로 인코딩합니다.

           Р  о  с  К  о  с  м  о  с
CP866:     90 AE E1 8A AE E1 AC AE E1
CP1251:    D0 EE F1 CA EE F1 EC EE F1
ISO8859-5: C0 DE E1 BA DE E1 DC DE E1

분명히 일반적으로 사용되는 8비트 키릴 문자 인코딩 중 어느 것도 입력 이름을 이와 같은 출력 이름으로 디코딩하지 않습니다. 여기에는 더 복잡한 일이 있습니다.

find이름을 디코딩 하는 방법을 알고 있다면 적절한 스크립트(https://unix.stackexchange.com/a/252000/17649),예를 들어

find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | here-goes-the-decoding pipeline )"' sh {} \;

또는전환율유용.

답변1

저는 1996년부터 오픈 소스 소프트웨어 및 기술을 전문적으로 다루는 인기 있는 러시아 리소스인 OpenNET.ru 포럼에서 솔루션을 찾았습니다.OpenNET에 게시Info-ZIP은 한때 MS-DOS를 실행하는 컴퓨터에서 ZIP 아카이브를 처리하는 데 널리 사용되는 도구였습니다. MS-DOS에는 CP850이라는 단 하나의 8비트 인코딩만 있으므로 모든 파일 이름이 자동으로 CP850->CP1252변환되었습니다. CP1252는 아마도 ISO-8859-1 문자 세트의 가장 널리 사용되는 인코딩 근사치로 선택될 것입니다.

따라서 키릴 문자 파일 이름이 포함된 아카이브를 추출한 후 실행할 올바른 find 명령은 다음과 같습니다.

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

흥미롭게도 CP1252를 사용하지 않고 ISO-8859-1을 사용하라는 권장 사항을 찾을 수 있습니다. iconv -f iso8859-1 -t cp850변환이 성공했지만 변환이 실패한 일부 아카이브를 만났기 때문에 이는 사실이 아닌 것 같습니다 iconv -f cp1252 -t cp850.

단일 역할로 돌아가기

           Р  о  с  К  о  с  м  о  с
CP866:     90 AE E1 8A AE E1 AC AE E1

이제 CP850 -> CP1252를 적용하면 결과는 C9 AB DF E8 AB DF BC AB DF우리가 관찰한 순서와 정확히 일치합니다.

또 다른 유용한 명령은

 unzip -l РосКосмос.zip | grep -aEv '^Archive:' | iconv -f iso8859-1 -t cp850 | iconv -f cp866

아카이브에서 파일 목록 가져오기

 Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

다음으로 시작하는 줄을 필터링하는 Archive:것은 아카이브 이름을 변환에서 숨기기 위한 보호 조치입니다.

답변2

"최근" infozip과 함께 사용된 ZIP 파일은 올바른 파일 이름을 표시합니다.

unzip -l Russian-Космос.zip 
Archive:  Russian-Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

РосКосмос/그리고 unzip은 압축을 풀 때 디렉토리를 올바르게 생성합니다.

infozip은 오래 전에 UTF-8 지원을 추가했습니다. 내 우분투에서 실행 가능:

UnZip 6.00, 20 April 2009
Zip 3.0,  July 5th 2008

따라서 문제는 이전 버전의 InfoZip(또는 UTF-8 지원 없이 컴파일된 버전)일 수 있습니다.

내 버전에서는 strings /usr/bin/unzip | grep -A8 -B8 'UTF-8'무엇보다도 다음을 생성합니다.

ZIP64_SUPPORT (archives using Zip64 for large files supported)
LARGE_FILE_SUPPORT (large files over 2 GiB supported)
other
UTF-8
UNICODE_SUPPORT [wide-chars, char coding: %s] (handle UTF-8 paths)
USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)
USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)

이는 컴파일/빌드 옵션과 관련된 것 같습니다.

답변3

zip에 대한 이 문제는 다음과 같습니다.안정적인최근에는Far2l 파일 및 아카이브 관리자. Far2l의 이전 zip 문자 집합 감지가 제대로 작동하려면 시스템 언어 설정이 아카이브가 생성된 시스템에 설정된 언어 설정과 일치해야 합니다(Windows의 내부 "zip 폴더" 도구는 동일한 논리를 사용함). 너도 할 수 있어

LANG=ru_RU.UTF-8 far2l

답변4

바닐라 unzip과 바닐라 p7zip 모두에서 OEM 코드 페이지 선택이 중단되었습니다. 내가 하나 만들었어수리하다이 문제를 해결하고우분투용 ppa이 패치가 적용된 p7zip을 사용하십시오.

관련 정보