首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在linux上创建一个保持unicode字符组合的zip?

如何在linux上创建一个保持unicode字符组合的zip?
EN

Unix & Linux用户
提问于 2023-02-02 09:59:08
回答 1查看 110关注 0票数 4

我在查Debian。我有一个名为Sóanr.jpg的文件。根据https://emojidissector.com/,这是由以下代码点组成的:

代码语言:javascript
复制
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和组合的尖锐重音被组合成一个新的代码点:

代码语言:javascript
复制
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代码点?

编辑:我成功地遵循了Stephen下面的示例,成功地实现了zipunzip。耶!这是个好消息。然而,在使用Nautilus right-click -> Extract Here时,我仍然存在上述问题。

如果我使用Nautilus right-click -> Extract Here解压缩我的归档文件,那么我的unicode字符就会像上面所描述的那样发生变化。所以我想Nautilus没有使用unzip

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

问题是:

有没有办法创建一个压缩存档,这样Nautilus的默认解压缩程序就不会破坏我的独角兽?

(还有:我如何才能弄清楚Nautilus使用什么程序来使用Extract Here?)

zip之前:

代码语言:javascript
复制
$ 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之后:

代码语言:javascript
复制
$ 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
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-02-02 11:32:25

你不需要做任何事

代码语言:javascript
复制
$ 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

这表明文件名是在创建时存储的。提取该文件将保留名称:

代码语言:javascript
复制
$ 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的工具也有同样的问题:

代码语言:javascript
复制
$ 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的输出),在测试最新版本是否仍然以这种方式运行之后,您可能希望打开一个。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/734057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档