最近程序中需要用到rubyzip這個gem進行解壓縮和壓縮,於是就遇到了中文文件名變成亂碼的問題。
首先,使用rubyzip解壓縮zip文件,代碼參照官網的示例很簡單
def unzip(zip_file, dest_dir) Zip::File.open zip_file do |zf| zf.each do |e| path = File.join dest_dir, e.name FileUtils.mkdir_p File.dirname(path) zf.extract(e, path) { true } end end end
發現中文文件名亂碼後,看文檔發現只需在方法開始加上 ,
Zip.force_entry_names_encoding = 'GBK'
經過測試果然解決問題。
應用裏還需要生成zip壓縮包,這裏就不貼代碼了,完全採用官網的示例即可,這次仔細看了說明,在其中加上下面這行即可順利生成包含中文文件名的zip壓縮包
Zip.unicode_names = true
def unzip(zip_file, dest_dir) file_encoding = detect_encoding_v2 zip_file Zip::File.open zip_file do |zf| zf.each do |e| name = e.name name = name.encode('GB18030', file_encoding) if file_encoding != 'ASCII' path = File.join dest_dir, name FileUtils.mkdir_p File.dirname(path) zf.extract(e, path) { true } end end end def detect_encoding_v2(zip_file) require 'charlock_holmes' names = [] Zip::File.open zip_file do |zf| zf.each do |e| name = e.name names << e.name end end ss = names.join cd = CharlockHolmes::EncodingDetector.detect(ss) syscoding = name.encoding.to_s.upcase coding = cd[:encoding].upcase if coding=='ASCII' && syscoding!='ASCII' coding = 'GB18030' end return coding end