問題描述
linux(我用的系統是centos)下zip原生命令解壓帶中文名的壓縮包時,解壓出來的文件為亂碼:
通過在網上查詢得知,zip格式中並沒有指定編碼格式,Windows下生成的zip文件中的編碼是GBK/GB2312等,導致這些zip文件在Linux下解壓時出現亂碼問題,因為Linux下的默認編碼是UTF8。
網上說,zip 有個參數-O可指定文件編碼,但是我在系統上卻沒有找到相應的參數:
原來unzip官方並不支持該參數,需要通過給unzip源碼打補丁包的方法,來解決中文編碼問題。
解決方法
unzip源碼編譯
首先下載unzip源碼:
https://svwh.dl.sourceforge.net/project/infozip/UnZip 6.x (latest)/UnZip 6.0/unzip60.tar.gz
由於unzip編譯需要bzip源碼,下載源碼:
https://iweb.dl.sourceforge.net/project/bzip2/bzip2-1.0.6.tar.gz
下載完成后,解壓文件:
tar zxvf unzip60.tar.gz
tar zxvf bzip2-1.0.6.tar.gz
將bzip2下所有文件拷貝到unzip60/bzip2下
make -f unix/Makefile flags
make -f unix/Makefile generic
即可生成unzip可執行文件,但此時是未經過修改的unzip。
我們還需要打補丁包。
打補丁包
下載補丁包:
https://bugs.archlinux.org/task/18691?getfile=5410
將補丁包unzip-6.0-iconv.patch 放進unzip60目錄下
patch -p1 < unzip-6.0-iconv.patch
即可完成打補丁操作。
由於補丁中調用了iconv庫,需要安裝iconv動態庫。
下載libiconv源碼,然后編譯安裝:
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar -zxvf libiconv-1.15.tar.gz
cd libiconv-1.15
./configure
make
make install
修改unzip的Makefile:
修改unix/Makefile
283行添加 -liconv
286行添加 -liconv
然后執行編譯:
make -f unix/Makefile flags
make -f unix/Makefile generic
重新編譯即可
即可到unzip
部署
目標機器下/usr/lib64/下需要有動態庫libiconv.so,將動態庫libiconv.so.2.6.0放置到/usr/lib64/,然后創建軟鏈接
cd /usr/lib64/
ln -s libiconv.so.2.6.0 libiconv.so.2
將unzip拷貝到目錄機器/usr/bin/下,替換原有的unzip程序。
然后執行unzip就可以看到-O參數了:
解壓中文件名的壓縮包,也沒有問題了: