Linux에서 유니코드 문자를 유지하는 zip을 만드는 방법은 무엇입니까?

Linux에서 유니코드 문자를 유지하는 zip을 만드는 방법은 무엇입니까?

저는 데비안을 사용하고 있습니다. Sóanr.jpg라는 파일이 있습니다. ~에 따르면https://emojidissector.com/, 이는 다음 코드 포인트로 구성됩니다.

S   0053    LATIN CAPITAL LETTER S
o   006F    LATIN SMALL LETTER O
́   0301    COMBINING ACUTE ACCENT
a   0061    LATIN SMALL LETTER A
n   006E    LATIN SMALL LETTER N
r   0072    LATIN SMALL LETTER R

이 파일의 zip 파일을 생성한 다음 압축을 풀면 라틴 소문자 O와 결합된 악센트가 결합되어 새로운 코드 포인트를 형성합니다.

S   0053    LATIN CAPITAL LETTER S
ó   00F3    LATIN SMALL LETTER O WITH ACUTE
a   0061    LATIN SMALL LETTER A
n   006E    LATIN SMALL LETTER N
r   0072    LATIN SMALL LETTER R

이것은 내가 원하는 것이 아닙니다. 원본 유니코드 코드 포인트를 보존하는 방법은 무엇입니까?


편집: 아래 Stephen Kitt의 예를 성공적으로 zip따를 수 있었습니다 . unzip응! 이것은 좋은 소식입니다. 그러나 Nautilus를 사용할 때 여전히 위와 같은 문제가 발생합니다 right-click -> Extract Here.

Nautilus를 사용하여 아카이브를 추출하면 right-click -> Extract Here유니코드 문자가 위에서 설명한 대로 변경됩니다. 그래서 노틸러스는 사용되지 않는 것 같아요 unzip.

zip(명령을 사용하든 Nautilus를 사용하든 zip을 만드는 방법은 중요하지 않은 것 같습니다 right-click -> Compress.)

질문은 다음과 같습니다.

노틸러스의 기본 압축 해제기가 내 유니코드를 손상시키지 않도록 zip 아카이브를 만드는 방법이 있습니까?

(또한: Nautilus가 어떤 프로그램을 사용하고 있는지 어떻게 알 수 있나요 Extract Here?)

앞으로 zip:

$ ls S* | od -a -t x1
0000000   S   o   L soh   a   n   r   .   z   i   p  nl
         53  6f  cc  81  61  6e  72  2e  7a  69  70  0a

뒤쪽에 right-click -> Extract Here:

$ ls S* | od -a -t x1
0000000   S   C   3   a   n   r   .   j   p   g  nl
         53  c3  b3  61  6e  72  2e  6a  70  67  0a

답변1

아무것도 할 필요가 없습니다:

$ touch So<0301>anr.jpg

$ ls So* | od -a -t x1
0000000   S   o   L soh   a   n   r   .   j   p   g  nl
         53  6f  cc  81  61  6e  72  2e  6a  70  67  0a
0000014

$ zip -9 unitest.zip So*
  adding: Sóanr.jpg (stored 0%)

$ unzip -v unitest.zip | grep Stored | od -a -t x1
0000000  sp  sp  sp  sp  sp  sp  sp   0  sp  sp   S   t   o   r   e   d
         20  20  20  20  20  20  20  30  20  20  53  74  6f  72  65  64
0000020  sp  sp  sp  sp  sp  sp  sp  sp   0  sp  sp  sp   0   %  sp   0
         20  20  20  20  20  20  20  20  30  20  20  20  30  25  20  30
0000040   2   -   0   2   -   2   0   2   3  sp   1   2   :   2   6  sp
         32  2d  30  32  2d  32  30  32  33  20  31  32  3a  32  36  20
0000060   0   0   0   0   0   0   0   0  sp  sp   S   o   L soh   a   n
         30  30  30  30  30  30  30  30  20  20  53  6f  cc  81  61  6e
0000100   r   .   j   p   g  nl
         72  2e  6a  70  67  0a
0000106

이는 파일 이름이 생성 시 저장되었음을 나타냅니다. 파일을 추출하면 이름이 보존됩니다.

$ rm So*

$ unzip unitest.zip
Archive:  unitest.zip
 extracting: Sóanr.jpg

$ ls So* | od -a -t x1
0000000   S   o   L soh   a   n   r   .   j   p   g  nl
         53  6f  cc  81  61  6e  72  2e  6a  70  67  0a
0000014

노틸러스는 아카이브를 추출하는 데 사용되지 않고 unzip다음을 사용합니다.무료 아카이브. libarchive를 사용하는 다른 도구에도 동일한 문제가 있습니다.

$ bsdtar -tf unitest.zip | od -a -t x1
0000000   S   C   3   a   n   r   .   j   p   g  nl
         53  c3  b3  61  6e  72  2e  6a  70  67  0a
0000013

난 아무것도 안 보여libarchive에 대해 제출된 관련 버그(의 출력 참조 ldd /usr/bin/nautilus) 최신 버전이 여전히 이런 방식으로 작동하는지 테스트한 후 열어볼 수 있습니다.

관련 정보