我最近寫了一個名爲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標誌,有什麼我可以看看對於?