JAVA匯出CSV檔案時產生亂碼的解決方法
阿新 • • 發佈:2019-02-07
Java程式碼
- OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");
- // 要輸出的內容
- result = (String)contentMap.get(RESPONSE_RESULT);
- resp.setHeader("Content-Disposition", "attachment;filename=test.csv");
- osw.write(result);
- osw.flush();
通過以上程式碼將內容輸出至CSV檔案中後,用EXCEL開啟檔案時,總是產生亂碼,但是用NOTEPAD++開啟時,顯示正常。然後,在NOTEPADD++的“格式”工具欄中查了一下檔案編碼,發現是“以UTF-8無BOM格式編碼”,然後試著將其改為“以UTF-8格式編碼”後,再用EXCEL開啟時,OK,一切顯示正常。那麼,這麼說明EXCEL是支援UTF-8格式的CSV檔案的。同時,也說明,通過以上方式匯出的檔案中是不含BOM資訊 的(關於BOM資訊請自行谷歌一下)。那麼,接下來,為了要讓EXCEL正確的顯示,要做的事就很明顯了----手動的給將要輸出的內容加上BOM標識。具體方法如下:
- OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");
- // 要輸出的內容
- result = (String)contentMap.get(RESPONSE_RESULT);
-
resp.setHeader("Content-Disposition", "attachment;filename=test.csv"
- osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
- osw.write(result);
- osw.flush();
重點就是上面的紅色程式碼(哎,ITEYE的這個編輯器怎麼了,設定了顏色顯示不出來)了(即倒數第三行程式碼),至於為什麼要新增這個,只要你自己谷歌過BOM的話,自然就明白了。
另外,如果你使用的是Response的OUT進行輸出的話,可以這麼搞:
Java程式碼- out = response.getOutputStream();
-
//加上UTF-8檔案的標識字元
- out.write(new byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF });