读取文档时的乱码问题
需求:用户下载范例csv文件(类似excel文件)后填写数据上传至系统,系统读取文件中的数据并将数据插入至数据库实现批量添加的功能
问题:csv文件上传后经debug调试发现读取到的中文数据全部为乱码
问题原因:乱码问题其实就是编码问题,上传的文件编码与我们读取文件时所使用的编码格式不一致时就会出现中文乱码的问题。
解决方法:使用与文件编码格式相同的编码去读取文件。
在系统中,原先的代码如下:
public List<String[]> readCSV(String filePath) throws IOException {
List<String[]> test = new LinkedList<>();
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(filePath)));
CSVReader reader = new CSVReader(isr);
reader.readNext();
List<String[]> list = reader.readAll();
for (String[] ss : list) {
test.add(ss);
}
return test;
}
可以看到,原先是直接使用InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(filePath)))去读取文件的,这样默认就是以UTF-8的编码格式去读取文件,但是InputStreamReader还有一个构造方法InputStreamReader(InputStream in, String charsetName)传入一个InputStream对象并且以指定的编码格式读取流对象,那么如何获取文件的编码格式呢?
获取文件的编码格式
使用EncodingDetect类,调用getJavaEncode(String filePath)方法,传入文件路径即可获取对应文件的编码格式
下载地址:https://download.csdn.net/download/alexzch1/12719085
使用方法:String fileEncode = EncodingDetect.getJavaEncode( filePath );
更改后的代码如下:
public List<String[]> readCSV(String filePath) throws Exception {
List<String[]> test = new LinkedList<>();
String fileEncode =EncodingDetect.getJavaEncode(filePath); //获取文件编码格式
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(filePath)),fileEncode);//以文件的编码格式读取文件
CSVReader reader = new CSVReader(isr);
reader.readNext();
List<String[]> list = reader.readAll();
for (String[] ss : list) {
test.add(ss);
}
return test;
}
另附github上找到的EncodingDetect:
https://github.com/929359291/EncodingDetect
参考博客:https://blog.csdn.net/u011279240/article/details/78467572