对于字符文件的读取若要读取到预期的文本内容则需要传递对应的文件编码,若出现读取文件的编码与文件实际编码不匹配时则会出现乱码,本文则是提供几种获取文件编码的实现方式。本文所述的文件编码格式是狭义的个人认为的UTF-8和GB2312(GBK)的中文编码,其它的非中文编码则不在考虑的范围内。
所以,本文以简单的示例出发,提供两个文件分别是GB2312.txt和UTF8.txt,在代码中分别获取到这两个文件的实际编码即可,目前掌握了共3种方式,详细参考如下:
Jdk内置Charset
这种方式没有具体的实践,听旁边的同时随口一说,主要是使用Charset中的编码进行编码,是canEncode是否可以按指定的编码进行编码啥的,同时也有见到那种将文件内容读取到,而后再转换为String类型,使用new String(文件内容.getBytes(编码) , 编码)后的文本再与原始文件内容进行对比,若对比一致则表示是指定的文本编码,这种搞法个人没有特别掌握,所以此处提及到即可。
Guava提供Utf8工具类
@Test
public void testGuava() throws Exception {
byte[] gb2312Bytes = FileUtils.readFileToByteArray(new File("c:\\test\\GB2312.txt"));
System.out.println("GB2312.txt文件是否是UTF-8编码:" + Utf8.isWellFormed(gb2312Bytes));
byte[] utf8ytes = FileUtils.readFileToByteArray(new File("c:\\test\\UTF-8.txt"));
System.out.println("UTF-8.txt文件是否是UTF-8编码:" + Utf8.isWellFormed(utf8ytes));
}
GB2312.txt文件输出false,UTF-8.txt文件输出true,该示例表示读取的文件内容的byte字节编码是否是UTF-8编码。
Github开源项目Cpdetector
稍稍的运行了一下Github开源项目Cpdetector,发现传递文件流或者文件地址,可以拿到指定文件的编码格式,这个实现还是不错的。由于分析的时间较短,但是输出的结果预期较好,若实际项目中去应用还需要更深入一轮的细节探究,比如detectorProxy还需要增加更多的instance实例,参考代码如下所示:
@Test
public testCpdetector() throws Exception {
File file1 = new File("c:\\test\\GB2312.txt");
File file2 = new File("c:\\test\\UTF-8.txt");
CodepageDetectorProxy detectorProxy = CodepageDetectorProxy.getInstance();
detectorProxy.add(ASCIIDetector.getInstance());
detectorProxy.add(UnicodeDetector.getInstance());
detectorProxy.add(JChardetFacade.getInstance());
System.out.println(detectorProxy.detectCodepage(file1.toURI().toURL()) + "----UTF-8编码");
System.out.println(detectorProxy.detectCodepage(file2.toURI().toURL()) + "----GB2312编码");
}
Apache Tika
Apache Tika开源项目可以从不同格式的文档中(例如HTML, PDF, OFFICE,jar,zip,mp3等等一千多种不同的文件类型),侦测和提取出元数据和结构化内容,Tika可用于搜索引擎索引、内容分析、翻译等,所以若仅仅拿来获取文件编码这点事情来说肯定是不在话下,但是个人从官网了解了一下,并且在写了一些相关的示例运行后并未得到期望的结果(但我认为它肯定是可以的),就这么着吧,后续再有类似需求时再深入研究。