linuxzip亂碼
更改源碼解決亂碼
調試發現問題出現在MultiByteToWideChar方法里,
如 MultiByteToWideChar(CP_ACP,0,fn,-1,tfn,MAX_PATH); 到這里時fn中的name屬性值還是正常的,在這個方法內部執行完tfn就亂了。
解決方法:
打開unzip.cpp源文件,找到函數
ZRESULT TUnzip::Get(int index,ZIPENTRY *ze)
{ // ......
// ......} 12345
這個函數里有
#ifdef UNICODE
MultiByteToWideChar(CP_UTF8,0,fn,-1,tfn,MAX_PATH);#else
strcpy(tfn,fn);#endif12345
把 CP_UTF8 改為CP_ACP, ( CP_ACP 指示要使用當前設置的 API 默認 Windows ANSI 代碼頁)
重新編譯後
這樣就解決了解壓中文文件名稱亂碼的問題
編譯時解決源碼問題(無需更改源碼)
上面的情況,我們我觀察到unzip源代碼這段開始的地方有判斷
#ifndef Ext_ASCII_TO_Native 1
這樣問題似乎更簡單了,不用改源代碼,只需在make時定義 Ext_ASCII_TO_Native 即可,這樣 Ext_ASCII_TO_Native 實際為一個空的宏,不進行任何轉換操作。
比如,使用下面的方法編譯
make -DExt_ASCII_TO_Native 1
或者在bash執行下面兩行
export LOCAL_UNZIP=-DExt_ASCII_TO_Native
make12
unzip解壓縮含中文文件名zip包是出現亂碼的問題解決!
如果您的系統已經安裝了unzip
方法一 unzip行命令解壓,指定字元集
通過unzip行命令解壓,指定字元集
unzip -O CP936 xxx.zip (用GBK, GB18030也可以)1
方法二 在環境變數中,指定unzip參數
在環境變數中,指定unzip參數,總是以指定的字元集顯示和解壓文件
/etc/environment中加入2行
UNZIP=」-O CP936″
ZIPINFO=」-O CP936″12
方法三 利用pyton來處理
復制以下內容(python)保存未myuzip.py文件腳本,並修改運行許可權為可運行(chmod +x uzip)
#!/usr/bin/env python# -*- coding: utf-8 -*-# uzip.pyimport osimport sysimport zipfileprint "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()
這樣以後我們解壓縮時只需要運行此文件即可
./myuzip.py xxxx.zip
② 急!!java linux 從伺服器上創建一個zip包 向zip包里寫文件 下載zip包中文亂碼
用的是什麼zip庫,有沒有設置編碼格式。
例如,zip4j的話,zf.setFileNameCharset("UTF-8");
③ linux與windows 互傳的文件,中文名稱出現亂碼
windows
系統自帶和第三方軟體使用的編碼不同就會導致這樣。vsftp
不支持編碼識別自動轉換。所以兩個客戶端軟體用的不同編碼就會讓
vsftp
的編碼混亂。一般來說
linux
現在都用
utf-8
一些新版本的
ftp
軟體默認也會去轉換為
utf-8
進行傳輸文件名,但
windows
似乎舊版本還是用本地編碼進行
io。也就是簡體中文用
gb
系列,繁體中文用
big
,英文用
ascii
什麼的互相不同的編碼。
④ linux系統,文件是utf-8格式的為什麼會亂碼呢
文件本向是UTF8的,但是你的系統當前用的可能不是,比如是GB2312,或者GBK之類的,這樣看utf8格式的文件就會是亂碼。
⑤ Linux系統終端字體亂碼(非管理員賬戶操作指南)
問題:使用一台Linux系統的機器,終端總是顯示有亂碼,不是中文亂碼,看起來像是英文亂碼,我這強迫症又受不了了
解決方案:
Linux字元編碼默認為UTF-8,如果出現英文亂碼有可能是系統設置的編碼方式為GBK。
設置locale的根本就是設置一組總共12個LC開頭的變數,不包括LANG和LC_ALL。
優先 級:LC_ALL > LC_* > LANG
可以看出原系統設置的為中文字體顯示和運行的語言環境,所有的設置都是使用的 zh_CN.gbk ,因中英文字元編碼方式不同,可能造成英文字元或者空格顯示有亂碼。
5.退出後再次查看locale(再次登錄才生效)
亂碼的字元消失了。locale轉變為:
⑥ 通過java控制linux環境下解壓文件夾後中文文件名是亂碼
將linux當前環境設置為中文環境即可。
修改/etc/sysconfig/i18n 文件
LANG="zh_CN.GB2312"