JAVA以UTF-8導出CSV文件,用excel打開產生亂碼的解決方法

先上一段代碼(上好的代碼,多年陳釀)

[java] view plain copy
  1. OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");    
  2. // 要輸出的內容    
  3. result = (String)contentMap.get(RESPONSE_RESULT);    
  4. resp.setHeader("Content-Disposition""attachment;filename=test.csv");    
  5. osw.write(result);    
  6. osw.flush();    
問題來了:

在SERVLET中,通過以上代碼將內容輸出至CSV文件中後,用EXCEL打開文件時,總是產生亂碼,但是用NOTEPAD++打開時,顯示正常。然後,在NOTEPADD++的“格式”工具欄中查了一下文件編碼,發現是“以UTF-8無BOM格式編碼”,然後試着將其改爲“以UTF-8格式編碼”後,再用EXCEL打開時,OK,一切顯示正常。那麼,這麼說明EXCEL是支持UTF-8格式的CSV文件的。同時,也說明,通過以上方式導出的文件中是不含BOM信息的(關於BOM信息請自行谷歌一下)。那麼,接下來,爲了要讓EXCEL正確的顯示,要做的事就很明顯了----手動的給將要輸出的內容加上BOM標識。具體方法如下:

[java] view plain copy
  1. OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");    
  2. // 要輸出的內容    
  3. result = (String)contentMap.get(RESPONSE_RESULT);    
  4. resp.setHeader("Content-Disposition""attachment;filename=test.csv");    
  5. osw.write(new String(new byte[] { (byte0xEF, (byte0xBB,(byte0xBF }));    
  6. osw.write(result);    
  7. osw.flush();   

重點就是上面的紅色代碼了(即倒數第三行代碼),至於爲什麼要添加這個,只要你自己谷歌過BOM的話,自然就明白了。

另外,如果你使用的是Response的OUT進行輸出的話,可以這麼搞:

[java] view plain copy
  1. out = response.getOutputStream();       
  2. //加上UTF-8文件的標識字符        
  3. out.write(new   byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF });  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章