2012-11-07 55 views
7

我最近寫了一個名爲zipzap的zip文件I/O庫,但我正在努力從任意zip文件正確解碼zip條目文件名。正確解碼zip條目文件名 - CP437,UTF-8或?

現在,PKWARE spec狀態:

D.1 ZIP格式歷來只支持原IBM PC的字符編碼 集,通常被稱爲IBM代碼頁437 ...

D.2如果未設置通用位11,則文件名和註釋應符合 與原始ZIP字符編碼的一致性。如果通用11位被設置,則 文件名和註釋必須支持Unicode標準,版本4.1.0或 更大使用由UTF-8存儲 規範中定義的字符編碼表...

其意味着符合zip文件將文件名編碼爲CP437,除非設置了EFS位,在這種情況下文件名是UTF-8。

不幸的是,很多zip工具似乎沒有正確設置EFS位(例如Mac CLI,GUI zip)或使用其他編碼,通常是默認系統(例如WinZip?)。如果您知道WinZip,7-Zip,Info-Zip,PKZIP,Java JAR/Zip,.NET zip,dotnetzip等編碼文件名以及它們將其「版本設置」字段設置爲何時拉鍊告訴我。

特別地,信息-Zip的嘗試此時解壓

  • 文件系統= MS-DOS(0)=> CP437
    • 除外:版本= 2.5,2.6,4.0 = > ISO 8859-1
  • 文件系統= HPFS(6)=> CP437
  • 文件系統= NTFS(10)和版本= 5.0 => CP437
  • 否則,ISO 8859-1

如果我要支持檢查或從任意壓縮文件解壓,並在文件名編碼一個合理嘗試沒有EFS標誌,有什麼我可以看看對於?

回答

2

確定文件名是否使用UTF-8編碼而不使用EFS標誌的唯一方法是檢查是否在其中一個字符中設置了高位。那可能可能意味着該字符是UTF-8編碼。然而,它仍然可能是另一種方式,因爲CP437中有一些字符的高位被設置,並且不能被解碼爲UTF-8。

我會堅持使用PKWARE應用筆記規範,而不是在試圖符合現有每個已知的zip應用的解決方案中進行破解。

2

目前情況如下:

  • 大多數Windows實現使用DOS(OEM)編碼
  • 的Mac OS的壓縮工具使用UTF-8,但它不設置UTF-8位標誌
  • * nix的壓縮實用程序默默地使用系統編碼

所以唯一的辦法是檢查文件名包含有類似的UTF8字符(檢查UTF8編碼的說明 - 第一個字節應該是110xx xxx,第二個 - 用於2字節編碼字符的10xxxxxx)。如果它是正確的utf8字符串 - 使用utf8編碼。如果不是 - 回退到OEM/DOS編碼。

相關問題