ZipInputStream解壓中文文件名失?。咳绾握_設置字符集?

ZipInputStream解壓中文文件名失???如何正確設置字符集?

ZipinputStream解壓中文文件名問題及解決方案

許多開發者在使用ZipInputStream解壓包含中文文件名或文件夾名的Zip壓縮包時,常常遭遇字符編碼問題,導致解壓失敗,并提示類似“malformed input off : 1, Length : 1”的錯誤。本文將深入分析此問題,并提供有效的解決方案。

問題根源在于ZipInputStream構造方法中指定的字符集并非用于解壓文件內部文件名編碼,而是用于讀取Zip文件本身的中央目錄信息。中央目錄的編碼取決于壓縮包的創建環境和操作系統windows系統通常使用GB2312或GBK編碼,而macoslinux系統通常使用UTF-8編碼。

因此,如果一個Zip壓縮包是在Windows系統下創建的,其中央目錄很可能使用GBK編碼。即使代碼中指定了UTF-8編碼,ZipInputStream仍然無法正確解析GBK編碼的中央目錄,從而導致解壓失敗。

解決方案:

針對Windows系統創建的Zip包,建議使用GBK編碼讀取中央目錄:

FileInputStream input = new FileInputStream(targetPath); ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(input), Charset.forName("GBK"));

由于GBK編碼兼容GB2312,此方法同樣適用于GB2312編碼的中央目錄。

跨平臺解決方案:

為了編寫更健壯的跨平臺兼容代碼,推薦使用apache Commons Compress庫。該庫提供更強大的壓縮/解壓縮功能,能夠自動處理不同編碼的Zip壓縮包,有效避免因字符集差異導致的解壓失敗。 它能自動檢測并處理不同編碼的中央目錄信息,簡化開發流程,并提升代碼的可靠性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享