2013年6月16日 星期日

解壓縮zip檔案:當中文字變成亂碼之二

前情見上一篇。 弄了一天多,總之弄出了可以用的東西(在這裡,想要看程式碼的人,歡迎光臨!)。

接著來說故事吧~也就是完成這個程式曲折離奇的過程。

首先,考慮到 zip-archive 的 Codec.Archive.Zip 中的 Entry 中的 eRelativePath 可能含有「未經轉換」的文字,所以先從這裡下手。 利用 ByteString 的 pack 方法把 String 變換成 ByteString 。然而,這樣做的問題是,ByteString 的 pack 方法會把非 ascii 字 內的資訊流掉(依據說明,它會讓 >255 的 Char 變成 255。)

於是,我想到可能可以利用FFI 來取得String在記憶體中的狀態,然後轉換成直接的ByteString對應。(C語言背景的想法)不過,最後我沒使用這招:讀了zip-archive的程式碼 發現,對於檔案名稱,它都利用 Data.ByteString.Utf8 把原本存在 zip 檔中的檔案名稱轉換成 utf8,即使它們不是...。也就是,eRelativePath 裡面的文字資訊是不行用的。

暫時還不想寫一個 zip 檔的程式庫,而且我也應該沒有這個能力,所以進去修改了zip-archive的程式碼,讓 Entry 資料結構裡面多放一個 eRawRelativePath,再利用 iconv 把它依據使用者的要求做轉換,然後再解壓縮。總之這樣就結束了。

如果今天 zip-archive 不是自由軟體,那就沒辦法做這樣的修改了。

沒有留言:

張貼留言