java中判断文本的编码格式的方法

  • Post author:
  • Post category:java


java中判断文本的编码格式的方法

很早之前遇到了一个问题,很多文本数据的解析是需要提前知道编码格式的,如果对并不知道编码格式就需要进行自动获取。

提到判断文本格式很多人往往会想到解析文本文件的前几个字节进行判断,或是通过java自带的字符串getBytes的方式进行转换,换成如utf-8之类的通用编码,但是通过测试会发现第一种方法只有部分程序保存的文件会携带这个标识,其他很多如notepad++等保存的完全不支持,第二种方法则完全不可用,直接变成乱码了。

判断文本的编码方式并没有这么简单,按照原理需要从编码格式层面对字符串进行分析,自己写是比较麻烦的,windows api中的MultiByteToWideChar和WideCharToMultiByte获取能帮到忙,但是不具有通用性。

那如何在java中进行编码判断呢,通过查找发现jchardet包是个不错的工具,这个应该是通过firefox的部分代码改进而来的。

首先,在工程中引入jchardet的jar包,或在maven中添加如下内容

<dependency>
    <groupId>net.sourceforge.jchardet</groupId>
    <artifactId>jchardet</artifactId>
    <version>1.0</version>
</dependency>

校验采用如下方式

public static String getTextCharset(byte[] data,String defaultcharset){
        nsDetector det = new nsDetector(nsPSMDetector.CHINESE);
        final StringBuffer fullcharset = new StringBuffer("");

        nsICharsetDetectionObserver server = new nsICharsetDetectionObserver(){
            public StringBuffer sb = fullcharset;
            public void Notify(String charset)
            {
                sb.append(charset);
            }
        };

        det.Init(server);
        det.DoIt(data, data.length,false);
        det.DataEnd();
        if(StringUtils.isBlank(fullcharset.toString())){
            return defaultcharset;
        }

        return fullcharset.toString();
    }

参数里data是原始数据



版权声明:本文为xyhshen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。