很抱歉问了一个类似于我之前的问题。与上一个问题的不同之处在于,现在它在一个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 的输入?
我会提取文件,然后执行
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
| 归档时间: |
|
| 查看次数: |
6860 次 |
| 最近记录: |