A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 祁焱 黑马帝   /  2011-10-27 00:12  /  5576 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

怎样利用java判断一个文本文件是属于什么编码格式的,例如是UTF—8还是ANCI。


该贴已经同步到 祁焱的微博

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
宁超 + 1 赞一个!
杨强 + 2 赞一个!

查看全部评分

6 个回复

倒序浏览
杨强 黑马帝 2011-10-27 00:28:25
沙发
用记事本打开,然后点“另存为”,看看下面默认的编码,如果是utf-8 ,那就是utf-8,如果是ansi,那就是gbk了

评分

参与人数 1黑马币 +10 收起 理由
宁超 + 10 利用Java哦。仔细点,

查看全部评分

回复 使用道具 举报
宁超 黑马帝 2011-10-27 08:44:01
藤椅
有现成的开源项目。cpdetector。你可以下载了研究下。
回复 使用道具 举报

FileRead 有个public String getEncoding()返回此流使用的字符编码的名称。你可以试试,
刚开始我也没有找到,都想到通过二进制找区别来判断了。看了下字符编码之间的区别
从中看到了可以从FileRead中找。累了我一小时。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 辛苦了、

查看全部评分

回复 使用道具 举报
黄健 黑马帝 2011-10-27 09:13:25
报纸
/*在网上搜索到的*/

在程序中,文本文件经常用来存储标准的ASCII码文本,比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符,如基于GBK的简体中文,基于BIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式;而在读取这些文本文件时,有时候就需要自动判定文件的编码格式。
    按照给定的字符集存储文本文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。

    对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下:

    测试文件编码是否为UTF-8

           File file = new File(path);

           InputStream ios = new java.io.FileInputStream(file);

           byte[] b = new byte[3];

           ios.read(b);

           ios.close();

           if (b[0] == -17 && b[1] == -69 && b[2] == -65)

               System.out.println(file.getName() + “:编码为UTF-8″);

           else

               System.out.println(file.getName() + “:可能是GBK,也可能是其他编码。”);

    上述代码只是简单判定了是否是UTF-8格式编码的文本文件,如果项目对要判定的文本文件编码不可控(比如用户上传的一些HTML、XML等文本),可以采用一个现成的开源项目:cpdetector,它所在的网址是:http://www.oschina.net/p/cpdetector。它的类库很小,只有500K左右,利用该类库判定文本文件的代码如下:

    FileEncodeDetector

    package cn.edu.cqu.tiger;

    import info.monitorenter.cpdetector.io.ASCIIDetector;

    import info.monitorenter.cpdetector.io.CodepageDetectorProxy;

    import info.monitorenter.cpdetector.io.JChardetFacade;

    import info.monitorenter.cpdetector.io.ParsingDetector;

    import info.monitorenter.cpdetector.io.UnicodeDetector;

    import java.io.BufferedReader;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.InputStreamReader;

    public class FileEncodeDetector {

        public static String getFileEncode(String path) {

           /*------------------------------------------------------------------------

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

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

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

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

             字符集编码。

              使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar

              cpDetector是基于统计学原理的,不保证完全正确。

           --------------------------------------------------------------------------*/

           CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();

           /*-------------------------------------------------------------------------

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

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

           ---------------------------------------------------------------------------*/

           detector.add(new ParsingDetector(false));

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 很给力!辛苦了

查看全部评分

回复 使用道具 举报
使用   
  StreamReader sr = new StreamReader("filepath", true/*detectEncodingFromByteOrderMarks*/);   
  通常,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字   
  符集的哪种编码保存的。软件有几种途径来决定文本的字符集和编码,   
  最标准的途径是检测文本最开头的几个字节,楼主可以以不同编码保存后研究一下各种格式看看.比如   
   
  开头字节 Charset/encoding   
  EF BB BF UTF-8   
  FE FF UTF-16/UCS-2, little endian   
  FF FE UTF-16/UCS-2, big endian   
  FF FE 00 00 UTF-32/UCS-4, little endian.   
  00 00 FE FF UTF-32/UCS-4, big-endian.
回复 使用道具 举报
陆华山 黑马帝 2011-10-27 09:34:04
7#
使用   
  StreamReader sr = new StreamReader("filepath", true/*detectEncodingFromByteOrderMarks*/);   
  通常,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字   
  符集的哪种编码保存的。软件有几种途径来决定文本的字符集和编码,   
  最标准的途径是检测文本最开头的几个字节,楼主可以以不同编码保存后研究一下各种格式看看.比如   
   
  开头字节 Charset/encoding   
  EF BB BF UTF-8   
  FE FF UTF-16/UCS-2, little endian   
  FF FE UTF-16/UCS-2, big endian   
  FF FE 00 00 UTF-32/UCS-4, little endian.   
  00 00 FE FF UTF-32/UCS-4, big-endian.

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 犀利。

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马