第一种我试过了不是很准,网上有人说是通过统计概率判断文件编码的再此处记录,
UTF8的CSV文件
用wps打开修改后保存,再用notepad打开显示为GB2312,该方法读取的编码格式为 UTF-16BE,按此格式读取文件出现乱码;
用excel2013打开修改后保存,再用notepad打开,看见格式仍然是GB2312,该方法判断文件编码格式为Big5,按此格式读取文件出现乱码;
jar包下载:
https://download.csdn.net/download/chen1280436393/11267094
public static void getFileEncode(File file){
String charsetName = null;
try{
CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
detector.add(new ParsingDetector(false));
detector.add(new ByteOrderMarkDetector());
detector.add(JChardetFacade.getInstance());
detector.add(ASCIIDetector.getInstance());
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset = detector.detectCodepage(file.toURL());
if (charset != null) {
charsetName = charset.name();
}else{
charsetName = "GB2312";
}
}catch (Exception e){
e.printStackTrace();
}
System.out.println("charsetName====="+charsetName);
}
查到另外一种方式,读取成功,该方法判断文件编码格式为GB18030,
(GB2312(1980年)、GBK(1995年)到GB18030(2000年),这些编码方法是向下兼容的)
public static void getFileCharsetByICU4J(File file) {
String encoding = null;
try {
Path path = Paths.get(file.getPath());
byte[] data = Files.readAllBytes(path);
CharsetDetector detector = new CharsetDetector();
detector.setText(data);
CharsetMatch match = detector.detect();
if (match == null) {
encoding = "默认";
}
encoding = match.getName();
} catch (IOException var6) {
}
System.out.println(encoding);
}
附maven依赖
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>59.1</version>
</dependency>