java判断文本文件编码格式

Wesley13
• 阅读 886

上篇文章需要读取当前java或者配置文件的编码格式,这里主要支持UTF-8、GBK、UTF-16、Unicode等

/**
     * 判断文件的编码格式
     * @param fileName :file
     * @return 文件编码格式
     * @throws Exception
     */
    public static String codeString(File fileName) throws Exception{
        BufferedInputStream bin = new BufferedInputStream(
        new FileInputStream(fileName));
        int p = (bin.read() << 8) + bin.read();
        String code = null;
        
        switch (p) {
            case 0xefbb:
                code = "UTF-8";
                break;
            case 0xfffe:
                code = "Unicode";
                break;
            case 0xfeff:
                code = "UTF-16BE";
                break;
            default:
                code = "GBK";
        }
        IOUtils.closeQuietly(bin);
        return code;
    }

上面这段代码只能判断带bom的文本,如果非bom文本,还有两种方式 1、 轮询常用的编码,知道找到匹配的,如下面一段测试代码

/*
 *  Copyright 2010 Georgios Migdos <cyberpython@gmail.com>.
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *  under the License.
 */

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

/**
 *
 * @author Georgios Migdos <cyberpython@gmail.com>
 */
public class CharsetDetector {

    public Charset detectCharset(File f, String[] charsets) {

        Charset charset = null;

        for (String charsetName : charsets) {
            charset = detectCharset(f, Charset.forName(charsetName));
            if (charset != null) {
                break;
            }
        }

        return charset;
    }

    private Charset detectCharset(File f, Charset charset) {
        try {
            BufferedInputStream input = new BufferedInputStream(new FileInputStream(f));

            CharsetDecoder decoder = charset.newDecoder();
            decoder.reset();

            byte[] buffer = new byte[512];
            boolean identified = false;
            while ((input.read(buffer) != -1) && (!identified)) {
                identified = identify(buffer, decoder);
            }

            input.close();

            if (identified) {
                return charset;
            } else {
                return null;
            }

        } catch (Exception e) {
            return null;
        }
    }

    private boolean identify(byte[] bytes, CharsetDecoder decoder) {
        try {
            decoder.decode(ByteBuffer.wrap(bytes));
        } catch (CharacterCodingException e) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        File f = new File("example.txt");

        String[] charsetsToBeTested = {"UTF-8", "windows-1253", "ISO-8859-7"};

        CharsetDetector cd = new CharsetDetector();
        Charset charset = cd.detectCharset(f, charsetsToBeTested);

        if (charset != null) {
            try {
                InputStreamReader reader = new InputStreamReader(new FileInputStream(f), charset);
                int c = 0;
                while ((c = reader.read()) != -1) {
                    System.out.print((char)c);
                }
                reader.close();
            } catch (FileNotFoundException fnfe) {
                fnfe.printStackTrace();
            }catch(IOException ioe){
                ioe.printStackTrace();
            }

        }else{
            System.out.println("Unrecognized charset.");
        }
    }
}
    

2、 使用谷歌依赖库来进行判断 https://code.google.com/archive/p/juniversalchardet/

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java的char类型真的可以存汉字么?
今天偶尔看到一句话:ANSI编码表示英文字符时用一个字节,表示中文用两个字节,而unicode不管表示英文字符还是中文都是用两个字节来表示。我突然间对自己之前对java变量以Unicode编码存储产生了疑问。到底是以Unicode编码存储的还是和源文件使用的编码格式相同呢?联想到之前的一个问题java的char类型是否可以存储汉字,这个问题是
皕杰报表在传参过程中乱码
当web项目的编码格式为UTF8的,在tomcat上集成部署,传参时中文乱码时,需要修改下列编码格式。​​解决方案:1、更改D:/Tomcat/conf/server.xml,指定浏览器的编码格式为“UTF8”:2、更改web项目WEBINF\resources下的Congfig.xml里的            UTF83、更改jsp中编码格式为utf8​
Stella981 Stella981
2年前
Google Java 代码规范
1.(1)简介本文档用于Java编程语言的Google源代码编码标准的完整定义。Java源文件定义为Google风格。于其他编程风格指南一样,所涉及的问题不止包含代码格式美化,还包括其他类型的约定或者编码标准。但是本文档主要关注普遍遵循的严格规则,并避免提供意义不明的可执行建议(无论任何方式)。1.1.
Stella981 Stella981
2年前
Jenkins maven 构建乱码,修改file.encoding系统变量编码为UTF
一切都是windows的控制台默认编码GBK问题情景:使用jenkins构建,console输出的中文乱码。代码编码格式是utf8,因为Jenkins会默认读取当前系统的编码格式,导致构建日志乱码和selenium自动化测试输入的中文乱码。控制台输出乱码!(https://oscimg.oschina.net/oscnet/4
Stella981 Stella981
2年前
Eclipse为不同的文件类型设置编码格式和编辑器
不知道大家遇到项目中编码格式不统一的情况没有,哈哈,我们就是,比如java的编码格式是GBK,html等编码是UTF8,这样会导致很多问题,比如提交了一个UTF8的java文件到SVN,会导致后端编译错误。如果是项目建立的时候,大家一定要注意保持编码格式的统一呀,最好用UTF8。我记录一下,怎么在Eclipse中为不同文本设置不同编码格式和编辑器。
Wesley13 Wesley13
2年前
Java 使用 ResourceBundle 类读取 properties 文件中文乱码的解决方案
Java使用java.util.ResourceBundle类的方式来读取properties文件时不支持中文,要想支持中文必须将文件设置为ISO88591编码格式,这对于开发工具默认为UTF8来说很不友好,而且就算用ISO88591编码,当其他人将这个项目导入开发工具时很容易出现这个properties文件中的内容有乱码(前提是该文件中包含中文)
Wesley13 Wesley13
2年前
JAVA判断文件编码类型
java读取文件,处理过程中,可能因为文件的编码问题导致了中文乱码。有时需要将UTF8的改为ANSI的编码。以下代码就可以判断文件是什么编码方式。 主要jar包:cpdetector.jar  下载地址http://cpdetector.sourceforge.net/ 同时还需jchardet1.0.jar这个包,否则detec
Wesley13 Wesley13
2年前
Java文件格式
\.java文件是保存源代码的文本文件(\代表类名)使用javac\.java可以编译该文件使用java\可以运行该类\.class是用于保存Java类的二进制编码以及Class对象,每一个Java类都有一个解释该类特征的Class对象。\.jar文件是一种压缩文件格式打包命令jarcvf
Wesley13 Wesley13
2年前
JAVA读取不同编码格式的TXT文件
最近做一个全文检索的功能,要求在用户上传附件时获取其内容存入数据库,CSV,EXCEL,WORD,PPT都搞定了。剩余一个最简单的TXT文档,开始忽略了它还有不同编码,导致一些编码格式的文本乱码。兼容写法如下,一个判断文件头的方法搞定所有。privateStringgetCharset(StringfileName
Stella981 Stella981
2年前
C++中字符编码的转换(Unicode、UTF
C的项目,字符编码是一个大坑,不同平台之间的编码往往不一样,如果不同编码格式用一套字符读取格式读取就会出现乱码。因此,一般都是转化成UTF8这种平台通用,且支持性很好的编码格式。Unicode、UTF8的概念不做过多解释,这里说一下ANSI,我第一次看到这个名词,我看成了ASCII。被Mentor狠批一顿。ANSI是一种字符代码,为使计算机支