如何在 Linux 上创建保留 unicode 字符组成的 zip?

如何在 Linux 上创建保留 unicode 字符组成的 zip?

我在Debian上。我有一个名为 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

这不是我想要的。如何保留原始的 unicode 代码点?


编辑:我能够成功地zip遵循unzip下面斯蒂芬·基特的例子。耶!这是个好消息。然而,我在使用 Nautilus 时仍然遇到上述问题right-click -> Extract Here

如果我使用 Nautilus 提取我的存档right-click -> Extract Here,我的 unicode 字符会发生如上所述的更改。所以我猜 Nautilus 没有使用unzip.

(我如何创建 zip 似乎并不重要——无论是使用命令zip还是使用 Nautilus 的right-click -> Compress。)

问题变成:

有没有办法创建 zip 存档,以便 Nautilus 的默认解压缩程序不会破坏我的 unicodes?

(以及:我怎样才能知道 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

Nautilus 不用于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),您可能需要在测试最新版本是否仍然以这种方式运行后打开一个。

相关内容