java自动探测文件的字符编码
Mozilla有一个C++版的自动字符集探测算法代码,然后sourceforge上有人将其改成java版的~~
主页:http://jchardet.sourceforge.net/
- jchardet is a java port of the source from mozilla's automatic charset detection algorithm.
- The original author is Frank Tang. What is available here is the java port of that code.
- The original source in C++ can be found from http://lxr.mozilla.org/mozilla/source/intl/chardet/
- More information can be found at http://www.mozilla.org/projects/intl/chardet.html
下面是见证奇迹的时刻:
- import java.io.BufferedInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import org.mozilla.intl.chardet.nsDetector;
- import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
- public class FileCharsetDetector {
- private boolean found = false;
- private String encoding = null;
- public static void main(String[] argv) throws Exception {
- File file1 = new File("C:\\test1.txt");
- System.out.println("文件编码:" + new FileCharsetDetector().guessFileEncoding(file1));
- }
- /**
- * 传入一个文件(File)对象,检查文件编码
- *
- * @param file
- * File对象实例
- * @return 文件编码,若无,则返回null
- * @throws FileNotFoundException
- * @throws IOException
- */
- public String guessFileEncoding(File file) throws FileNotFoundException, IOException {
- return guessFileEncoding(file, new nsDetector());
- }
- /**
- * <pre>
- * 获取文件的编码
- * @param file
- * File对象实例
- * @param languageHint
- * 语言提示区域代码 @see #nsPSMDetector ,取值如下:
- * 1 : Japanese
- * 2 : Chinese
- * 3 : Simplified Chinese
- * 4 : Traditional Chinese
- * 5 : Korean
- * 6 : Dont know(default)
- * </pre>
- *
- * @return 文件编码,eg:UTF-8,GBK,GB2312形式(不确定的时候,返回可能的字符编码序列);若无,则返回null
- * @throws FileNotFoundException
- * @throws IOException
- */
- public String guessFileEncoding(File file, int languageHint) throws FileNotFoundException, IOException {
- return guessFileEncoding(file, new nsDetector(languageHint));
- }
- /**
- * 获取文件的编码
- *
- * @param file
- * @param det
- * @return
- * @throws FileNotFoundException
- * @throws IOException
- */
- private String guessFileEncoding(File file, nsDetector det) throws FileNotFoundException, IOException {
- // Set an observer...
- // The Notify() will be called when a matching charset is found.
- det.Init(new nsICharsetDetectionObserver() {
- public void Notify(String charset) {
- encoding = charset;
- found = true;
- }
- });
- BufferedInputStream imp = new BufferedInputStream(new FileInputStream(file));
- byte[] buf = new byte[1024];
- int len;
- boolean done = false;
- boolean isAscii = false;
- while ((len = imp.read(buf, 0, buf.length)) != -1) {
- // Check if the stream is only ascii.
- isAscii = det.isAscii(buf, len);
- if (isAscii) {
- break;
- }
- // DoIt if non-ascii and not done yet.
- done = det.DoIt(buf, len, false);
- if (done) {
- break;
- }
- }
- imp.close();
- det.DataEnd();
- if (isAscii) {
- encoding = "ASCII";
- found = true;
- }
- if (!found) {
- String[] prob = det.getProbableCharsets();
- //这里将可能的字符集组合起来返回
- for (int i = 0; i < prob.length; i++) {
- if (i == 0) {
- encoding = prob[i];
- } else {
- encoding += "," + prob[i];
- }
- }
- if (prob.length > 0) {
- // 在没有发现情况下,也可以只取第一个可能的编码,这里返回的是一个可能的序列
- return encoding;
- } else {
- return null;
- }
- }
- return encoding;
- }
- }
上面是判断文件编码的demo,本人测试了一下,得到的结果还是比较靠谱的~
上面提到的主页上还有一个HtmlCharsetDetector的demo,感兴趣的话可以去看一下。
java自动探测文件的字符编码的更多相关文章
- python学习笔记(2)--列表、元组、字符串、字典、集合、文件、字符编码
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表和元组的操作 列表是我们以后最长用的数据类型之一,通过列表可以最方便的对数据实现最方便的存储.修改等操作 定 ...
- Day2 - Python基础2 列表、字符串、字典、集合、文件、字符编码
本节内容 列表.元组操作 数字操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 ...
- python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
- linux下改变文件的字符编码
首先确定文件的原始字符编码: $ file -bi test.txt 然后用 iconv 转换字符编码 $ iconv -f from-encoding -t to-encoding file > ...
- Gnu Linux下文件的字符编码及转换工具
/********************************************************************* * Author : Samson * Date ...
- eclipse设置新建jsp文件默认字符编码为utf-8
在使用Eclipse开发中,编码默认是ISO-8859-1,不支持中文.这样我们每次新建文件都要手动修改编码,非常麻烦.其实我们可以设置文件默认编码,今后再新建文件时就不用修改编码了. 1.打开Ecl ...
- fedora23深度配置gnome系统环境, 如设置ibus的面板字体大小 以及gedit 自动探测文件字符编码fileencodings
除了系统桌面gnome, 以及gnome应用程序自带的preferences, 还有很多设置, 没有在preferences, 而是被深度地隐藏在系统中, 这时, 需要安装 dconf-tools: ...
- python 读写文件和设置文件的字符编码
一. python打开文件代码如下: f = open("d:\test.txt", "w") 说明:第一个参数是文件名称,包括路径:第二个参数是打开的模式mo ...
- Java Web---登录验证和字符编码过滤器
什么是过滤器? 在Java Web中,过滤器即Filter.Servlet API中提供了一个Filter接口(javax.servlet.Filter).开发web应用时,假设编写的Java类实现了 ...
随机推荐
- 迁移桌面程序到MS Store(3)——开机自启动
迁移桌面程序的时候,有可能你会遇到这么个需求——开机自启动.Windows传统桌面程序的传统陋习.不论什么奇葩软件都想要开机自启动,默认就给你打开,一开机哐哐哐什么雷,什么企鹅都蹦出来,也不管你用不用 ...
- Lerning Entity Framework 6 ------ Inserting, Querying, Updating, and Deleting Data
Creating Entities First of all, Let's create some entities to have a test. Create a project Add foll ...
- centos下配置nginx遇到的一些基本的坑
作为一个用.net的渣渣,常年混迹在window平台下,对Linux啥都不懂.随着.net core开源.跨平台后,也开始学习下linux. 在Desktop/Webs下放了一个index.html的 ...
- JQuery 知识
1.修改标签内容: *html( ) 相当于innerHTML * text( ) 相当于innerText 2.属性操作: *attr( ) 读/写/添加/设置属性 *removeAttr ...
- Python2 指定文件编码格式需要注意的地方
python2 中默认的编码格式是unicode, 开发人员经常需要根据需要,将python文件的编码格式设置为utf-8,我们可以在python文件的第一行进行设置,加入如下代码: # encodi ...
- 复习 C++ 中类的函数指针
函数指针这种东西,平时工作中基本上不会用到. 那函数指针会用在哪里? 下面是一些基本的用法,根据消息号调到对应的函数: #include <iostream> #include <m ...
- 重拾 BFC、IFC、GFC、FFC
温故知新,巩固基础 从 FC 开始 FC,Formatting Context,格式化上下文,是 W3C CSS2.1 规范中的一个概念,定义的是页面中一块渲染区域,并且有一套渲染规则,它决定了其子元 ...
- 关于SVM(support vector machine)----支持向量机的一个故事
一.预告篇: 很久很久以前,有个SVM, 然后,……………………被deep learning 杀死了…………………………………… . 完结……撒花 二.正式篇 好吧,关于支持向量机有一个故事 ,故事是 ...
- Eclipse安装ModelGoon控件(ModelGoon控件反向生成UML)
Eclipse安装ModelGoon 1 下载ModelGoon到本地,放在eclipse的安装目录下 2 打开Eclipse,点击Help,选择Install new software 3 点击ad ...
- 企业域的冗余设计①:DHCP冗余设计(上)
在许多企业网络中,为了方便客户端IP地址的管理,通常采用的是自动获取的方式向DHCP服务器获得IP地址.为了保证DHCP服务器能够正常稳定地向客户端提供IP地址的租赁,DHCP服务器的冗余设计就显得格 ...