java生成csv文件乱码

    /** * CSV文件生成方法 * @param head表单头 * @param dataList表单内容 * @param outPutPath输出路径 * @param filename表单文件名 * @return */ public static File createCSVFile(List head, List<List> dataList,String outPutPath, String filename) { File csvFile = null; BufferedWriter csvWtriter = null; try { csvFile = new File(outPutPath + File.separator + filename + ".csv"); File parent = csvFile.getParentFile(); FileOutputStream fos = new FileOutputStream(csvFile); // 写入bom头 byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf}; fos.write(uft8bom); if (parent != null && !parent.exists()) { parent.mkdirs(); } csvFile.createNewFile(); // GB2312使正确读取分隔符"," csvWtriter = new BufferedWriter(new OutputStreamWriter(fos, "utf-8")); // 写入文件头部 writeRow(head, csvWtriter); // 写入文件内容 for (List row : dataList) { writeRow(row, csvWtriter); } csvWtriter.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { csvWtriter.close(); } catch (IOException e) { e.printStackTrace(); } } return csvFile; }

    备注:以上是修正后的代码,正确无误。

    原因是导出的csv文件开头缺少BOM (BOM就是这3个字节 :"EF BB BF" ,BOM的全称叫做"Byte Order Mark")字符,导致微软的记事本Word等打开无法识别部分汉字。win平台默认的utf8编码的文本性文件带有BOM,但是java转换流写入的utf8文件不带BOM,所有Java导出的文件不带bom会导致部分汉字乱码。

    所以解决办法:加上bom头  

    byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};
    fos.write(uft8bom);

    Java导出cvs文件的详细代码请查看:点击此处跳转

    参考:https://www./qq2267711589/p/10822682.html