`
hdwangyi
  • 浏览: 183139 次
社区版块
存档分类
最新评论

判定文件编码或文本流编码的方法

    博客分类:
  • Java
阅读更多
  在程序中,文本文件经常用来存储标准的ASCII码文本,比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符,如基于GBK的简体中文,基于GIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式;而在读取这些文本文件时,有时候就需要自动判定文件的编码格式。

  按照给定的字符集存储文本文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。

  对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下:
 
    java.io.File f=new java.io.File("待判定的文本文件名");
    try{
      java.io.InputStream ios=new java.io.FileInputStream(f);
      byte[] b=new byte[3];
      ios.read(b);
      ios.close();
      if(b[0]==-17&&b[1]==-69&&b[2]==-65)
         System.out.println(f.getName()+"编码为UTF-8");
      else System.out.println(f.getName()+"可能是GBK");
    }catch(Exception e){
       e.printStackTrace();
    }
  

上述代码只是简单判定了是否是UTF-8格式编码的文本文件,如果项目对要判定的文本文件编码不可控(比如用户上传的一些HTML、XML等文本),可以采用一个现成的开源项目:cpdetector,它所在的网址是:http://cpdetector.sourceforge.net/。它的类库很小,只有500K左右,利用该类库判定文本文件的代码如下:
  /*------------------------------------------------------------------------
    detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
    cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法
    加进来,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。  
    detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
    字符集编码。
  --------------------------------------------------------------------------*/
  cpdetector.io.CodepageDetectorProxy detector =
  cpdetector.io.CodepageDetectorProxy.getInstance();
  /*-------------------------------------------------------------------------
    ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
    指示是否显示探测过程的详细信息,为false不显示。
  ---------------------------------------------------------------------------*/
  detector.add(new cpdetector.io.ParsingDetector(false)); 
  /*--------------------------------------------------------------------------
    JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
    测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
    再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
   ---------------------------------------------------------------------------*/ 
  detector.add(cpdetector.io.JChardetFacade.getInstance());
  //ASCIIDetector用于ASCII编码测定
  detector.add(cpdetector.io.ASCIIDetector.getInstance());
  //UnicodeDetector用于Unicode家族编码的测定
  detector.add(cpdetector.io.UnicodeDetector.getInstance());
  java.nio.charset.Charset charset = null;
  File f=new File("待测的文本文件名");
  try {
        charset = detector.detectCodepage(f.toURL());
  } catch (Exception ex) {ex.printStackTrace();}
  if(charset!=null){
       System.out.println(f.getName()+"编码是:"+charset.name());
  }else
      System.out.println(f.getName()+"未知");

上面代码中的detector不仅可以用于探测文件的编码,也可以探测任意输入的文本流的编码,方法是调用其重载形式:
 charset=detector.detectCodepage(待测的文本输入流,测量该流所需的读入字节数);

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

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

  读入属性文件的一般方法是:
 
  FileInputStream ios=new FileInputStream("属性文件名");
  Properties prop=new Properties();
  prop.load(ios);
  ios.close();
  

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

  在上面的代码中,属性文件的实际编码就可以利用上面的方法获得。当然,象这种属性文件是项目内部的,我们可以控制属性文件的编码格式,比如约定采用Windows内定的GBK,就直接利用"gbk"来转码,如果约定采用UTF-8,也可以是使用"UTF-8"直接转码。如果想灵活一些,做到自动探测编码,就可利用上面介绍的方法测定属性文件的编码,从而方便开发人员的工作。
分享到:
评论
4 楼 54powerman 2007-08-04  
不错,挺好用的。
3 楼 54powerman 2007-08-04  
不错,挺好用的。
2 楼 hdwangyi 2007-08-03  
walkandsing 写道
mozilla基金会有一个Firefox用来自动探测编码的库,java下的port叫jchardet,也挺好用的
JChardet已经包含在cpdetector里了,上面的cpdetector的示例的注释中已经说明了这一点。
1 楼 walkandsing 2007-08-03  
mozilla基金会有一个Firefox用来自动探测编码的库,java下的port叫jchardet,也挺好用的

相关推荐

    Java判定文件编码或文本流编码的方法[文].pdf

    Java作为一种广泛使用的编程语言,提供了多种方式来判断文件或文本流的编码。以下是对标题和描述中所述知识点的详细解释: 1. **文件编码的概念**:文件编码指的是在文件中存储字符的方式。常见的文件编码包括ASCII...

    java判断文件编码或文本流编码的方法宣贯.pdf

    总的来说,Java中判断文件或文本流编码的方法主要包括直接读取文件头字节进行比较和使用第三方库进行复杂检测。前者适用于有限的编码格式,后者则提供了更全面的解决方案,适用于各种场景,尤其是处理用户上传或不可...

    Java判断文件编码格式 - 明明是悟空 - 博客园1

    本文将探讨如何使用Java进行文件编码格式的识别,主要介绍两种方法:一种是简单的UTF-8判断,另一种是使用开源库cpdetector。 首先,对于简单的UTF-8编码格式判断,我们可以直接读取文件的前三个字节来确定。UTF-8...

    java程序判断文件编码的类型

    ### Java程序判断文件编码的类型 #### 知识点概览 本文档旨在教导读者如何通过Java编程语言来判断文件...通过以上方法,我们可以有效地判断文件的编码类型,并据此进行相应的编码转换操作,以确保文本数据的正确处理。

    判断文件是文本文件还是二进制文件

    如果没有发现'/0',则可以假设它是ASCII文本文件,但这并不能完全排除某些含有特殊编码(如UTF-8)的文本文件,因为这些编码可能会包含0字节,但仍然属于文本文件范畴。 另外,还可以使用更复杂的方法来判断,比如...

    UTF-8或者GBK文本格式判断

    Recognize类判定指定文本文件为UTF-8还是GBK编码格式。

    chardet 1.0 java

    下面将详细阐述文件编码、判定方法以及chardet库的相关知识点。 文件编码是用来表示文本字符的二进制表示方式,常见的有ASCII、ISO-8859-1、GB2312、GBK、Big5、UTF-8、UTF-16等。每种编码都有其特定的字符集和编码...

    哈夫曼树与哈夫曼编码

    例如,在给定一段文本的情况下,如果使用等长的ASCII编码或固定长度的编码,将无法达到最优的编码效率。哈夫曼编码通过分析字符的出现频率来构造编码表,使得出现频率高的字符拥有较短的编码,从而整体上减少所需的...

    自动检测汉字GB18030编码与UTF-8编码

    想到如下特征来识别汉字: 1. 如果第1位是0就不需要判断的,一定是ASCII字符。... 如果第1位是1开头的,第2位是0开头的,一定是GB编码。 3. 如果第1位是非1110开头的,则一定是GB编码。 4. 多做几个汉字判断。

    XVID编码器源代码剖析(含SSE2汇编)

    这些文本信息通常以ASCII码形式嵌入到视频流中,便于后期编辑或查看元数据。 ###### 1.2.9 图像后处理 为了改善解码后的图像质量,XVId提供了一系列后处理技术,包括去块效应滤波、边缘增强等,这些技术有助于提高...

    压缩软件(数据结构课程设计).docx

    该软件的要求是建立一个文本文件 A,统计该文件中各字符频率,使用 Huffman 编码将该文件翻译成 Huffman 编码文件 B,然后将 Huffman 编码文件译码成文件 C,并对文件 A 与 C 进行比较。 算法思想描述 ------------...

    One-Hot编码、Word2Vec、FastText、Glove、

    One-Hot编码是将离散的特征转换为数值特征的技术,常用于文本特征提取和机器学习模型中。其原理是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。 One-...

    5.2哈夫曼树与哈夫曼编码1

    哈夫曼树(Huffman Tree),也称为最优二叉树,是一种特殊的二叉树结构,...构建哈夫曼树的过程涉及到带权路径长度的计算以及最小堆的使用,是数据结构和算法领域中的重要概念,广泛应用于文本压缩、图像处理等领域。

    javaScript判定提交内容是否超过数据库长度

    示例函数getLength通过正则表达式替换了所有非ASCII字符(即Unicode编码范围在0x00到0xff之外的字符),假设这些字符是中文或其他双字节字符,替换后计算剩余字符串的长度,从而近似得出实际的字符长度。 具体实现...

    基于Seq2Seq自编码器模型的交通事故实时检测与评价.pdf

    【Seq2Seq自编码器模型】是深度学习领域中一种重要的序列到序列(Sequence-to-Sequence)学习模型,常用于自然语言处理任务如机器翻译、文本摘要和语音识别。该模型由编码器(Encoder)和解码器(Decoder)两部分...

    无符号整数表达式的判定

    本文将深入解析由给定文件中的代码片段实现的无符号整数表达式的判定方法,并对其工作原理、设计思路以及潜在的应用场景进行详尽的解释和分析。 #### 代码结构与功能解析 ##### 类定义与初始化 代码首先定义了一个...

    javascript文档

    encodeURIComponent 方法 将文本字符串编码为合法的通用资源标识符 (URI)组件。 Enumerator 对象 提供集合中的项的枚举。 相等运算符(==) 比较两个表达式,看是否相等。 Error 对象 包含在运行 JScript 代码时...

Global site tag (gtag.js) - Google Analytics