zip压缩文件名称中的中文编码

Tim*_*Tim 5 encoding

很抱歉问了一个类似于我之前的问题。与上一个问题的不同之处在于,现在它在一个zip存档中,在提取和列出zip存档内容后,压缩文件名称中的中文编码都无法识别:

$ unzip -l "???????(c???)?????.zip"
Archive:  ???????(c???)?????.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    25600  2000-01-04 23:27   ?+?+i- ??-?.doc
    80896  2000-01-04 23:27   ?+??i- -+.doc
    41984  2000-01-04 23:27   ?++?i- i+????-?.doc
    52224  2000-01-04 23:27   ?+?+i- ??i?.doc
    50688  2000-01-04 23:27   ?+??i- ??????.doc
    54272  2000-01-04 23:27   ?++?i- -????-??????.doc
    26112  2000-01-04 23:27   ?+?-i- ?????????_+?.doc
    76288  2000-01-04 23:27   ?+-?i- -??-????-?.doc
    53760  2000-01-04 23:27   ?+-?i- -+?+++?=.doc
    53760  2000-01-04 23:27   ?+--i- ??.doc
  7929077  2009-02-26 22:49   -???????+C????+??+?+?+pdf.pdf
---------                     -------
  8444661                     11 files
Run Code Online (Sandbox Code Playgroud)

我想知道如何处理这个问题?

感谢致敬!


更新:

我已将此 zip 存档上传到,可以从http://www.mediafire.com/?dw87ee72m56evy9下载


我尝试使用 chardet 通过以下方式确定压缩文件名称的编码:

$ unzip -l "???????(c???)?????.zip" | chardet
<stdin>: utf-8 (confidence: 0.99)
Run Code Online (Sandbox Code Playgroud)

但是文件名确实是用 utf-8 编码的吗?他们不应该使用外国编码吗?我猜输出unzip -l太多了,我该如何只挑出输出中的文件名作为 chardet 的输入?

小智 5

尝试:

unzip -O cp936 "???????(c???)?????.zip"
Run Code Online (Sandbox Code Playgroud)


enz*_*tib 2

我会提取文件,然后执行

ls | chardet
Run Code Online (Sandbox Code Playgroud)

看看它说了什么。

另外,您可以尝试不同的编码

ls | iconv -f GB2312
Run Code Online (Sandbox Code Playgroud)

例如。iconv您可以看到with已知的编码iconv -l。

一旦确定了编码,假设是GB2312,你应该修改文件名,将编码更改为UTF8

for f in *; do
  g="$(iconv -f GB2312 <<<"$f")"
  mv "$f" "$g"
done
Run Code Online (Sandbox Code Playgroud)

编辑

尝试对您的 zip 文件进行暴力攻击,转换为每种已知的编码,但在我看来,它们都不可信

#!/bin/bash

iconv -l | 
  sed  's|//$||' | 
  while read enc; do 
    printf "\n --- $enc ---\n\n"
    ls | iconv -cf "$enc" 2>/dev/null
  done
Run Code Online (Sandbox Code Playgroud)


小智 0

通常文件名被解释为西方字符集。因此,您必须首先将文件名从 UTF-8 转换回 ISO,然后将该“字节流”解释为 GB2312 回 UTF-8。IE:

LS | iconv -f UTF-8 -t ISO8859-1 | iconv -f UTF-8 -t ISO8859-1 | iconv -f UTF-8 -t ISO8859-1 iconv -f GB2312 -t UTF-8

这不适用于您的特定文件,因此您可能想了解该文件是如何创建的(什么系统、什么程序、什么语言等)

另请参阅http://en.wikipedia.org/wiki/Mojibake