先上一段代碼(上好的代碼,多年陳釀)
- 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();
在SERVLET中,通過以上代碼將內容輸出至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();
重點就是上面的紅色代碼了(即倒數第三行代碼),至於爲什麼要添加這個,只要你自己谷歌過BOM的話,自然就明白了。
另外,如果你使用的是Response的OUT進行輸出的話,可以這麼搞:
- out = response.getOutputStream();
- //加上UTF-8文件的標識字符
- out.write(new byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF });