首页 > Java > java教程 > 正文

使用java.nio.charset.CharsetDecoder自动识别字符集方法

高洛峰
发布: 2017-03-12 09:43:23
原创
2569人浏览过

这篇文章介绍使用java.nio.charset.charsetdecoder自动识别字符集方法

研究了在网上能找到的自动识别字符集的办法,有效的就是利用第三方类库jchardet。也有用cpdetector,其实也是利用jchardet。偶然发现jdk的java.nio.charset.CharsetDecoder可以用来识别字符集。

一、原理

一般用两种方法构建InputStreamReader:

InputStreamReader reader = new InputStreamReader(in, charsetName);
登录后复制

集简云
集简云

软件集成平台,快速建立企业自动化与智能化

集简云 22
查看详情 集简云

立即学习Java免费学习笔记(深入)”;

或者

InputStreamReader reader = new InputStreamReader(in, charset);
登录后复制

立即学习Java免费学习笔记(深入)”;

如果charset不匹配,则输出乱码。

还有一种构建方法,即利用CharsetDecoder:

CharsetDecoder cd = charset.newDecoder();
InputStreamReader reader = new InputStreamReader(in, cd);
登录后复制

立即学习Java免费学习笔记(深入)”;

这时如果不匹配,则抛出异常

java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:277)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:338)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
        ....
登录后复制

立即学习Java免费学习笔记(深入)”;

这样,就可以用作字符集探测。

二、AutoCharsetReader的使用

AutoCharsetReader是根据上述原理,参考InputStreamReader而写成的类,继承Reader,可以看作为Charset自适应的InputStreamReader。

AutoCharsetReader ar= new AutoCharsetReader(in);char c = ar.read();
...char[] cbuf = new char[2000];
ar.read(cbuf);
...
BufferedReader br = new BufferedReader(ar);
br.readLine();
...
登录后复制

立即学习Java免费学习笔记(深入)”;

再比如Lucene创建全文索引的TextField需要Reader参数,可以直接利用这个类:

Field field = new TextField("content", new AutoCharsetReader(file));
登录后复制

立即学习Java免费学习笔记(深入)”;

读完文件之后,可以得到文件的charset。注意,是读完之后。

Charset charset = ar.charset();
登录后复制

立即学习Java免费学习笔记(深入)”;

三、备选字符集

因为采用多次尝试的办法来最终确定字符集,所以要提供备选。当前代码提供的默认备选字符集如下:

    private final static String[] _defaultCharsets = {        
            "US-ASCII",            "UTF-8",            "GB2312", 
            "BIG5",            "GBK",            "GB18030",                
            "UTF-16BE", 
            "UTF-16LE", 
            "UTF-16",            "UNICODE"};
登录后复制

立即学习Java免费学习笔记(深入)”;

也提供了更改备选字符集的方法。比如:

AutoCharsetReader ar = new AutoCharsetReader(in).setCharset("ascii", "utf-8", "gbk");
登录后复制

立即学习Java免费学习笔记(深入)”;

先后顺序会影响探测结果。比如,如果GBK在GB2312之前,则检测结果只能是GBK,不会是GB2312,因为GBK包含GB2312。

四、只作字符集检测

可以只用作字符集检测:

charset = AutoCharsetReader.quickDetect(file.toURI().toURL(), charsets);
or:
charset = AutoCharsetReader.deepDetect(file.toURI().toURL(), charsets, stops);
登录后复制

立即学习Java免费学习笔记(深入)”;

quickDetect只读一个字符,适用于单字符集文件。对于html,可能需要全部读完才知道charset,则使用deepDetect。其中参数charsets可以为null

如果一组文件,已知可能的字符集有“ascii”,“utf-8”,“gb2312”,和“gbk”,当检测得知一个文件的字符集为“utf-8”或"gbk"的时候,可以马上返回结果,无需继续读文件。这时可以把stops参数赋值为{"utf-8", "gbk"}。为null则需全部读完。

五、其他

为提高效率,本类设有buffer,初选的字符集解码失败,不必重新读取io。buffer大小默认为8192,对象构建时可以自定义buffer大小,若参数小于16,则设为16。

 

以上就是使用java.nio.charset.CharsetDecoder自动识别字符集方法的详细内容,更多请关注php中文网其它相关文章!

相关标签:
java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号