先上一段代碼(上好的代碼铺然,多年陳釀)
1OutputStreamWriter osw = newOutputStreamWriter(resp.getOutputStream(), "UTF-8");?
2// 要輸出的內(nèi)容?
3result = (String)contentMap.get(RESPONSE_RESULT);?
4resp.setHeader("Content-Disposition", "attachment;filename=test.csv");?
5osw.write(result);?
6osw.flush();
問(wèn)題來(lái)了:
在SERVLET中,通過(guò)以上代碼將內(nèi)容輸出至CSV文件中后,用EXCEL打開文件時(shí)斋否,總是產(chǎn)生亂碼,但是用NOTEPAD++打開時(shí)拭荤,顯示正常茵臭。然后,在NOTEPADD++的“格式”工具欄中查了一下文件編碼舅世,發(fā)現(xiàn)是“以UTF-8無(wú)BOM格式編碼”旦委,然后試著將其改為“以UTF-8格式編碼”后,再用EXCEL打開時(shí)雏亚,OK缨硝,一切顯示正常。那么罢低,這么說(shuō)明EXCEL是支持UTF-8格式的CSV文件的查辩。同時(shí),也說(shuō)明网持,通過(guò)以上方式導(dǎo)出的文件中是不含BOM信息的(關(guān)于BOM信息請(qǐng)自行谷歌一下)宜岛。那么,接下來(lái)功舀,為了要讓EXCEL正確的顯示萍倡,要做的事就很明顯了----手動(dòng)的給將要輸出的內(nèi)容加上BOM標(biāo)識(shí)。具體方法如下:
1OutputStreamWriter osw = newOutputStreamWriter(resp.getOutputStream(), "UTF-8");?
2// 要輸出的內(nèi)容?
3result = (String)contentMap.get(RESPONSE_RESULT);?
4resp.setHeader("Content-Disposition", "attachment;filename=test.csv");?
5osw.write(newString(newbyte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF}));?
6osw.write(result);?
7osw.flush();
重點(diǎn)就是上面的紅色代碼了(即倒數(shù)第三行代碼)辟汰,至于為什么要添加這個(gè)列敲,只要你自己谷歌過(guò)BOM的話,自然就明白了帖汞。
另外酿炸,如果你使用的是Response的OUT進(jìn)行輸出的話,可以這么搞:
1out = response.getOutputStream();????
2//加上UTF-8文件的標(biāo)識(shí)字符
<span style="font-family:"
font-size:13px;line-height:22.1px;"=""><strong><span
style="color:#ff0000;">//加上bom頭涨冀,才不會(huì)中文亂碼
</span></strong></span><span
style="color:#222222;font-family:"
font-size:13px;line-height:22.1px;"=""><strong>
</strong></span> out.write(new?? byte []{( byte ) 0xEF ,(
byte ) 0xBB ,( byte ) 0xBF });
以上來(lái)自網(wǎng)頁(yè):http://blog.csdn.net/youzhouliu/article/details/52038889
以上操作可能不適合各種各樣的操作填硕,不一定完全按照他的方式
總之一個(gè)原則,就是寫文件時(shí)先將new byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF }寫入到文件中,再寫其他的內(nèi)容扁眯,同時(shí)要注意其他內(nèi)容用utf-8編碼壮莹。
以下是我的代碼:
01byte[] bom = newbyte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF};
02file = newFile(fileName);
03?
04if(file.exists()){
05????file.delete();
06}
07?
08FileWriter fileWriter = newFileWriter(file);
09fileWriter.write(newString(bom));
10writer = newCSVWriter(fileWriter);
11...
12writer.writeAll(allContent);
注意:allContent內(nèi)容的編碼需要是utf-8的,如果不是utf-8姻檀,則需要轉(zhuǎn)為utf-8命满,否則仍然會(huì)亂碼