站長資訊網
最全最豐富的資訊網站

java導出csv亂碼解決方法介紹

java導出csv亂碼解決方法介紹

1、問題

將查詢的數據以xls文件導出時(UTF-8編碼),數據正常;但以CSV文件導出時,文件中的中文亂碼,同樣是UTF-8編碼,改成GBK編碼導出時,中文顯示正常。

本以為問題解決,后面導出含拉丁字符(如à?êàì)的數據時,以xls文件導出數據正常顯示,以CSV文件導出時,文件中的拉丁字符顯示為“?”號。

試著改成其他編碼方式都無效,后面網上搜到了一篇解決該問題的方法。

2、解決方法

以CSV方式導出的文件中默認不含BOM信息,通過給將要輸出的內容設置BOM標識(以 EF BB BF 開頭的字節流)即可解決該問題。具體方法如下:(推薦:java視頻教程)

... OutputStreamWriter outputStreamWriter = new OutputStreamWriter(response.getOutputStream(), "UTF-8");   // 要輸出的內容   result = (String)contentMap.get(RESPONSE_RESULT);   response.setHeader("Content-Disposition", "attachment;filename=test.csv");   outputStreamWriter.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}));   outputStreamWriter.write(result);   outputStreamWriter.flush();

如果是以OutputStream流實現的 ,參數可以按如下修改:

out = response.getOutputStream();      //加上UTF-8文件的標識字符       out.write(new byte []{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});

注:

BOM: Byte Order Mark,字節順序標記(以下摘自百度百科)

在UCS 編碼中有一個叫做 “Zero Width No-Break Space” ,中文譯名作“零寬無間斷間隔”的字符,它的編碼是 FEFF。而 FFFE 在 UCS 中是不存在的字符,所以不應該出現在實際傳輸中。

UCS 規范建議我們在傳輸字節流前,先傳輸字符 “Zero Width No-Break Space”。這樣如果接收者收到 FEFF,就表明這個字節流是 Big-Endian 的;如果收到FFFE,就表明這個字節流是 Little- Endian 的。因此字符 “Zero Width No-Break Space(零寬無間斷間隔)” 又被稱作 BOM。

UTF-8 不需要 BOM 來表明字節順序,但可以用 BOM 來表明編碼方式。字符 “Zero Width No-Break Space” 的 UTF-8 編碼是 EF BB BF。所以如果接收者收到以 EF BB BF 開頭的字節流,就知道這是 UTF-8編碼了。Windows 就是使用 BOM 來標記文本文件的編碼方式的。

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
亚洲av无码国产精品色午夜字幕| 久久亚洲精品11p| 亚洲?V乱码久久精品蜜桃| 亚洲国产成人久久精品软件| 久久精品国产亚洲av影院| 国产精品特级毛片一区二区三区| 伊在人亚洲香蕉精品区麻豆| 日韩人妻一区二区三区免费| 国产精品冒白浆免费视频| 国产精品高清视亚洲精品| 久久成人国产精品| 好属妞这里只有精品久久| 久久人人超碰精品CAOPOREN| 精品一区二区三区电影| 亚洲欧洲日韩不卡| 日韩午夜在线观看| 蜜桃精品免费久久久久影院 | 国产精品免费久久久久久久久| 四虎成人精品无码永久在线 | 99视频精品国在线视频艾草| 久久久久久亚洲精品中文字幕| 亚洲精品国产成人片| 国产在vr视频精品观看| 亚洲中文久久精品无码ww16| 69精品人人人人| 亚洲精品高清国产一线久久| 国内精品伊人久久久久AV影院 | 亚洲国产精品无码久久久秋霞2| 久久精品国产一区二区| 久久精品女人天堂AV麻| 99精品国产一区二区三区| 国产亚洲精品不卡在线| 久久亚洲中文字幕精品一区| 国产午夜精品理论片免费观看| 国产在线精品一区二区三区不卡| 亚洲精品国产精品乱码不卞| 亚洲国产精品日韩专区AV| 日韩成人大屁股内射喷水| 三上悠亚日韩精品一区在线| 日韩制服国产精品一区| 亚洲欧美中文日韩视频|