1. 程式人生 > >ubuntu 16.04L解壓zip檔案出現亂碼

ubuntu 16.04L解壓zip檔案出現亂碼

開個傳送門:http://blog.csdn.net/qq_27803491/article/details/50375092

下附原文:

常遇到這個問題,今天終於解決了,參考網址:http://forum.ubuntu.org.cn/viewtopic.php?t=175405

有2種方式解決問題:

1. 通過unzip行命令解壓,指定字符集
unzip -O CP936 xxx.zip 
(用GBK, GB18030也可以)
有趣的是unzip的manual中並無這個選項的說明, unzip --help對這個引數有一行簡單的說明

2. 在環境變數中,指定unzip引數,總是以指定的字符集顯示和解壓檔案
/etc/environment中加入2行

UNZIP="-O CP936"
ZIPINFO="-O CP936"
這樣Gnome桌面的歸檔檔案管理器(file-roller)可以正常使用unzip解壓中文,但是file-roller本身並不能設定編碼傳遞給unzip。

我先用了第二種方法,但是發現自己沒裝file-roller,於是用第一種方法指定字符集,然後就搞定了,但是還是覺得這個CP936。。。。記不住阿,不知道還有沒有更好的方法

著作權歸作者所有。
商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者:Latm Ake
連結:http://www.zhihu.com/question/20523036/answer/35225920
來源:知乎

由於zip格式中並沒有指定編碼格式,Windows下生成的zip檔案中的編碼是GBK/GB2312等,因此,導致這些zip檔案在Linux下解壓時出現亂碼問題,因為Linux下的預設編碼是UTF8。

目前網上流傳一種unzip -O cp936的方法,但一些unzip是沒有-O這個選項的。

我使用的版本 unzip 6.0 debian modified 版本有這個選項

我發現另外兩種解決方案可用。

python方案

此方案目前來看非常完美。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import zipfile

#print "Processing File " + sys.argv[1]

file=zipfile.ZipFile(sys.argv[1],"r");
for name in file.namelist():
    utf8name=name.decode('gbk')
#    print "Extracting " + utf8name
    pathname = os.path.dirname(utf8name)
    if not os.path.exists(pathname) and pathname!= "":
        os.makedirs(pathname)
    data = file.read(name)
    if not os.path.exists(utf8name):
        fo = open(utf8name, "w")
        fo.write(data)
        fo.close
file.close()

Windows 使用者遮蔽兩條 print 語句,Linux 使用者不用遮蔽


7z方案

需要安裝p7zip和convmv,在Fedora下的命令是


su -c 'yum install p7zip convmv'

在ubuntu下的安裝命令是


sudo apt-get install p7zip convmv

安裝完之後,就可以用7za和convmv兩個命令完成解壓縮任務。


LANG=C 7za x your-zip-file.zip
convmv -f GBK -t utf8 --notest -r .

第一條命令用於解壓縮,而LANG=C表示以US-ASCII這樣的編碼輸出檔名,如果沒有這個語言設定,它同樣會輸出亂碼,只不過是UTF8格式的亂碼(convmv會忽略這樣的亂碼)。

第二條命令是將GBK編碼的檔名轉化為UTF8編碼,-r表示遞迴訪問目錄,即對當前目錄中所有檔案進行轉換。