JAVA判断文件编码类型

Wesley13
• 阅读 851

java读取文件,处理过程中,可能因为文件的编码问题导致了中文乱码。有时需要将UTF-8的改为ANSI的编码。以下代码就可以判断文件是什么编码方式。 
主要jar包:cpdetector.jar  
下载地址http://cpdetector.sourceforge.net/ 

同时还需jchardet-1.0.jar这个包,否则detector.add(cpdetector.io.JChardetFacade.getInstance());  会报错; 
下载地址http://www.jarfinder.com/index.php/jars/versionInfo/40297 

还有一个antlr.jar,不然运行过程中detector.add(new ParsingDetector(false));会报错; 
下载地址http://www.java2s.com/Code/Jar/ABC/Downloadantlrjar.htm 

Java代码   JAVA判断文件编码类型

  1. import info.monitorenter.cpdetector.io.ASCIIDetector;

  2. import info.monitorenter.cpdetector.io.CodepageDetectorProxy;

  3. import info.monitorenter.cpdetector.io.JChardetFacade;

  4. import info.monitorenter.cpdetector.io.ParsingDetector;

  5. import info.monitorenter.cpdetector.io.UnicodeDetector;

  6. import java.io.File;

  7. import java.nio.charset.Charset;

  8. /**

  9. *

  10. */

  11. /**

  12. * @author weict

  13. *

  14. */

  15. public class JudgeFileCode {

  16. /**

  17. * @param args

  18. */

  19. public static void main(String[] args) {

  20. /*------------------------------------------------------------------------

  21. detector是探测器,它把探测任务交给具体的探测实现类的实例完成。

  22. cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法

  23. 加进来,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。

  24. detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的

  25. 字符集编码。

  26. --------------------------------------------------------------------------*/

  27. CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();

  28. /*-------------------------------------------------------------------------

  29. ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于

  30. 指示是否显示探测过程的详细信息,为false不显示。

  31. ---------------------------------------------------------------------------*/

  32. detector.add(new ParsingDetector(false));//如果不希望判断xml的encoding,而是要判断该xml文件的编码,则可以注释掉

  33. /*--------------------------------------------------------------------------

  34. JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码

  35. 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以

  36. 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。

  37. ---------------------------------------------------------------------------*/

  38. detector.add(JChardetFacade.getInstance());

  39. // ASCIIDetector用于ASCII编码测定

  40. detector.add(ASCIIDetector.getInstance());

  41. // UnicodeDetector用于Unicode家族编码的测定

  42. detector.add(UnicodeDetector.getInstance());

  43. Charset charset = null;

  44. File f = new File("文件路径");

  45. try {

  46. charset = detector.detectCodepage(f.toURL());

  47. } catch (Exception ex) {

  48. ex.printStackTrace();

  49. }

  50. if (charset != null) {

  51. System.out.println(f.getName() + "编码是:" + charset.name());

  52. } else {

  53. System.out.println(f.getName() + "未知");

  54. }

  55. }

  56. }

上面代码中的detector不仅可以用于探测文件的编码,也可以探测任意输入的文本流的编码,方法是调用其重载形式: 

Java代码   JAVA判断文件编码类型

  1. charset=detector.detectCodepage(待测的文本输入流,测量该流所需的读入字节数);

  

上面的字节数由程序员指定,字节数越多,判定越准确,当然时间也花得越长。要注意,字节数的指定不能超过文本流的最大长度。 

  判定文件编码的具体应用举例: 
  属性文件(.properties)是Java程序中的常用文本存储方式,象STRUTS框架就是利用属性文件存储程序中的字符串资源。它的内容如下所示: 

1. #注释语句  

2. 属性名=属性值  

  读入属性文件的一般方法是: 

Java代码   JAVA判断文件编码类型

  1. FileInputStream ios=new FileInputStream("属性文件名");

  2. Properties prop=new Properties();

  3. prop.load(ios);

  4. ios.close();

  利用java.io.Properties的load方法读入属性文件虽然方便,但如果属性文件中有中文,在读入之后就会发现出现乱码现象。发生这个原因是load方法使用字节流读入文本,在读入后需要将字节流编码成为字符串,而它使用的编码是“iso-8859-1”,这个字符集是ASCII码字符集,不支持中文编码,所以这时需要使用显式的转码: 

Java代码   JAVA判断文件编码类型

  1. String value=prop.getProperty("属性名");

  2. String encValue=new String(value.getBytes("iso-8859-1"),"属性文件的实际编码");

  在上面的代码中,属性文件的实际编码就可以利用上面的方法获得。当然,象这种属性文件是项目内部的,我们可以控制属性文件的编码格式,比如约定采用Windows内定的GBK,就直接利用"gbk"来转码,如果约定采用UTF-8,也可以是使用"UTF-8"直接转码。如果想灵活一些,做到自动探测编码,就可利用上面介绍的方法测定属性文件的编码,从而方便开发人员的工作。 

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java判断文本文件编码格式
上篇文章需要读取当前java或者配置文件的编码格式,这里主要支持UTF8、GBK、UTF16、Unicode等/判断文件的编码格式@paramfileName:file@return文件编码格式@throwsException/pu
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这