我在使用au.com.bytecode.opencsv.CSVWriter
导出csv文件时遇到问题。我做了类似的事情:
File file = File.createTempFile("UserDetails_", ".csv");
CSVWriter writer = new CSVWriter(new OutputStreamWriter(
new FileOutputStream(file), "UTF-8"),
',');
然后当我导出.csv文件时,它会显示法语字母的垃圾字符。[要保存在.csv中的数据是法语字符]。 但以前我做的事情是:
CSVWriter writer = new CSVWriter(new FileWriter(file));
,然后它完美地显示了Windows环境中的所有法语字符,但在Prod环境[Linux]中它显示了垃圾。所以我想使用字符集UTF-8
来导出文件格式。
我该如何摆脱这个问题? 请建议!! 提前谢谢!
答案 0 :(得分:1)
假设:您使用Excel在Windows下打开CSV。
不幸的是,Excel在阅读UTF-8时很糟糕。即使它不是必需的,如果它使用任何UTF- *编码,Excel希望在CSV的开头有byte order mark,否则它将尝试使用Windows 1252读取它!
解决方案?呃......不要使用Excel?
无论如何,用你原来的方式:
CSVWriter writer = new CSVWriter(new FileWriter(file));
这将使用JVM的默认编码;这是Windows下的windows-1252和Linux下的UTF-8。
请注意,Apache的commons-io有BOM{Input,Output}Stream
个类,可以帮助你。
另一个解决方案是(ewwww)始终使用Windows-1252进行读/写。
其他说明:如果您使用Java 7,请使用Files.newBuffered{Reader,Writer}()
方法 - 以及try-with-resources语句。