? ? ? ?后臺微服務運行在linux環境里,前端Vue。在一個項目中,把后臺的文件打包成zip,下載到前臺。結果發現zip文件名本身亂碼,zip文件內壓縮的文件也是亂碼。所謂亂碼,程序員都見過,就是中文變成了亂七八糟的字符。
? ? ? ? 起初覺得問題比較簡單,網上導出都是解決方案。真正試試,一個不靈。最后還是公司技術大佬自己解決的。
? ? ? ? 不能說網上的東西都是錯了,但確實很大一部分都是沒有自己實踐,直接轉的。我們試了無效也不能說就是錯的,可能和環境、版本等等都有關系。自己實踐吧。
? ? ? ? 1、Zip文件中的文件名使用的是一種稱為"CP437"的字符集編碼,所以要按CP437編碼文件名字。?
? ? ? ? ? ? ZipEntry ze = new ZipEntry(文件名字);
? ? ? ? ? ??結果:文件名字這各種轉換,無效,怎么折騰都是亂碼,而且更亂。
? ? ? ? ? ? ?我們案例的正解:
? ? ? ? ZipOutputStream zos = new ZipOutputStream(fos);
? ? ? ? zos.setEncoding(“UTF-8”);
? ? ? ?2、zip文件名本身亂碼
FileOutputStream fos = new FileOutputStream(文件名字);
? ? ? ? ? ?文件名字這里也是各種轉碼,折騰,全部無效。
? ? ? ? ? ?我們案例的正解:
? ? ? ? ? ? ? ? ? ?問題根本就不出現在這里,而是出現在前端。文件名稱是通過Content-Disposition頭傳遞的,attachment; filename=文件名,這里的文件名字要java.net.URLEncoder.encode處理下。
? ? ? ? ? ?如果各位也遇到類似問題,可以參照下。關鍵是分析到底那步出現的問題:是服務器端生成時出現的,還是傳遞過程中發生的。
? ? ? ? ?