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

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

抱歉,我问了类似问题我以前的与上一个问题不同的是,现在是 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

我想知道如何解决这个问题?

感谢致敬!


更新:

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


我尝试使用 chardet 来确定压缩文件名称的编码:

$ unzip -l "严蔚敏数据结构(c语言版)教材及答案.zip" | chardet
<stdin>: utf-8 (confidence: 0.99)

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

答案1

尝试:

unzip -O cp936 "严蔚敏数据结构(c语言版)教材及答案.zip"

答案2

我会提取文件,然后做一个

ls | chardet

看看它说了什么。

另外,你可以尝试使用不同的编码

ls | iconv -f GB2312

iconv例如。您可以使用查看已知的编码iconv -l

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

for f in *; do
  g="$(iconv -f GB2312 <<<"$f")"
  mv "$f" "$g"
done

编辑

尝试对你的 zip 文件进行暴力破解,并转换成所有已知的编码,但在我看来,没有一种是可行的

#!/bin/bash

iconv -l | 
  sed  's|//$||' | 
  while read enc; do 
    printf "\n --- $enc ---\n\n"
    ls | iconv -cf "$enc" 2>/dev/null
  done

答案3

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

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

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

也可以看看http://en.wikipedia.org/wiki/Mojibake

答案4

你会需要图标, 但康维转换率是可选的。

Step 1, find the correct char-encode converting chain.
Step 2, rename files by a shell script.

有时,转换链中会出现错误的字符编码。你必须找出差距,顺便说一下恩佐替布的帖子。

例如在utf8文件系统中名为“冼极.otf”的文件。

touch 冼极.otf

我必须执行以下操作才能获得其正确的名称“宋体.otf”。

convmv --notest -f utf8 -t cp950 *.otf
convmv --notest -f cp936 -t utf8 *.otf

获得正确的名称后,可以使用转换率就像下面的脚本一样。在我的例子中,最后是“宋體.otf”。

#!/bin/sh
# bash shell script
mkdir TW
for filename in *; do [ -d "$filename" ] || echo "$filename" ; done |
    while read filename; do 
    filename_TW=`echo "$filename" | cconv -f UTF8-CN -t UTF8-TW` 
    printf "\n --- $filename $filename_TW ---\n\n"
    #uncomment lines below if you've confirmed the names
    #mv "$filename" "TW/$filename_TW"
    #touch "$filename"
    done

以下是另一个示例丹尼尔的帖子。utf8 文件系统中名为“ý¹úÖ¾.txt”的文件。

touch ý¹úÖ¾.txt

经过一番尝试,我发现它的正确简体中文名称是“三国志.txt”

ls | iconv -f utf-8 -t iso-8859-1 | iconv -f cp936 -t utf-8

然后我将其重命名为繁体中文名称“三國志.txt”

#!/bin/sh
mkdir BACKUP
for filename in *; do [ -d "$filename" ] || echo "$filename" ; done |
    while read filename; do 
    filename_TW=`echo "$filename" | iconv -f utf-8 -t iso-8859-1 | iconv -f cp936 -t utf-8 | cconv -f UTF8-CN -t UTF8-TW` 
    mv "$filename" "$filename_TW"
    touch "BACKUP/$filename"
    done

相关内容