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