Mozilla有一个C++版的自动字符集探测算法代码,然后sourceforge上有人将其改成java版的~~

主页:http://jchardet.sourceforge.net/

  1. jchardet is a java port of the source from mozilla's automatic charset detection algorithm.
  2. The original author is Frank Tang. What is available here is the java port of that code.
  3. The original source in C++ can be found from http://lxr.mozilla.org/mozilla/source/intl/chardet/
  4. More information can be found at http://www.mozilla.org/projects/intl/chardet.html

下面是见证奇迹的时刻:

  1. import java.io.BufferedInputStream;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6.  
  7. import org.mozilla.intl.chardet.nsDetector;
  8. import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
  9.  
  10. public class FileCharsetDetector {
  11. private boolean found = false;
  12. private String encoding = null;
  13.  
  14. public static void main(String[] argv) throws Exception {
  15. File file1 = new File("C:\\test1.txt");
  16.  
  17. System.out.println("文件编码:" + new FileCharsetDetector().guessFileEncoding(file1));
  18. }
  19.  
  20. /**
  21. * 传入一个文件(File)对象,检查文件编码
  22. *
  23. * @param file
  24. * File对象实例
  25. * @return 文件编码,若无,则返回null
  26. * @throws FileNotFoundException
  27. * @throws IOException
  28. */
  29. public String guessFileEncoding(File file) throws FileNotFoundException, IOException {
  30. return guessFileEncoding(file, new nsDetector());
  31. }
  32.  
  33. /**
  34. * <pre>
  35. * 获取文件的编码
  36. * @param file
  37. * File对象实例
  38. * @param languageHint
  39. * 语言提示区域代码 @see #nsPSMDetector ,取值如下:
  40. * 1 : Japanese
  41. * 2 : Chinese
  42. * 3 : Simplified Chinese
  43. * 4 : Traditional Chinese
  44. * 5 : Korean
  45. * 6 : Dont know(default)
  46. * </pre>
  47. *
  48. * @return 文件编码,eg:UTF-8,GBK,GB2312形式(不确定的时候,返回可能的字符编码序列);若无,则返回null
  49. * @throws FileNotFoundException
  50. * @throws IOException
  51. */
  52. public String guessFileEncoding(File file, int languageHint) throws FileNotFoundException, IOException {
  53. return guessFileEncoding(file, new nsDetector(languageHint));
  54. }
  55.  
  56. /**
  57. * 获取文件的编码
  58. *
  59. * @param file
  60. * @param det
  61. * @return
  62. * @throws FileNotFoundException
  63. * @throws IOException
  64. */
  65. private String guessFileEncoding(File file, nsDetector det) throws FileNotFoundException, IOException {
  66. // Set an observer...
  67. // The Notify() will be called when a matching charset is found.
  68. det.Init(new nsICharsetDetectionObserver() {
  69. public void Notify(String charset) {
  70. encoding = charset;
  71. found = true;
  72. }
  73. });
  74.  
  75. BufferedInputStream imp = new BufferedInputStream(new FileInputStream(file));
  76. byte[] buf = new byte[1024];
  77. int len;
  78. boolean done = false;
  79. boolean isAscii = false;
  80.  
  81. while ((len = imp.read(buf, 0, buf.length)) != -1) {
  82. // Check if the stream is only ascii.
  83. isAscii = det.isAscii(buf, len);
  84. if (isAscii) {
  85. break;
  86. }
  87. // DoIt if non-ascii and not done yet.
  88. done = det.DoIt(buf, len, false);
  89. if (done) {
  90. break;
  91. }
  92. }
  93. imp.close();
  94. det.DataEnd();
  95.  
  96. if (isAscii) {
  97. encoding = "ASCII";
  98. found = true;
  99. }
  100.  
  101. if (!found) {
  102. String[] prob = det.getProbableCharsets();
  103. //这里将可能的字符集组合起来返回
  104. for (int i = 0; i < prob.length; i++) {
  105. if (i == 0) {
  106. encoding = prob[i];
  107. } else {
  108. encoding += "," + prob[i];
  109. }
  110. }
  111.  
  112. if (prob.length > 0) {
  113. // 在没有发现情况下,也可以只取第一个可能的编码,这里返回的是一个可能的序列
  114. return encoding;
  115. } else {
  116. return null;
  117. }
  118. }
  119. return encoding;
  120. }
  121. }

上面是判断文件编码的demo,本人测试了一下,得到的结果还是比较靠谱的~

上面提到的主页上还有一个HtmlCharsetDetector的demo,感兴趣的话可以去看一下。

java自动探测文件的字符编码的更多相关文章

  1. python学习笔记(2)--列表、元组、字符串、字典、集合、文件、字符编码

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表和元组的操作 列表是我们以后最长用的数据类型之一,通过列表可以最方便的对数据实现最方便的存储.修改等操作 定 ...

  2. Day2 - Python基础2 列表、字符串、字典、集合、文件、字符编码

    本节内容 列表.元组操作 数字操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 ...

  3. python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  4. linux下改变文件的字符编码

    首先确定文件的原始字符编码: $ file -bi test.txt 然后用 iconv 转换字符编码 $ iconv -f from-encoding -t to-encoding file > ...

  5. Gnu Linux下文件的字符编码及转换工具

    /*********************************************************************  * Author  : Samson  * Date   ...

  6. eclipse设置新建jsp文件默认字符编码为utf-8

    在使用Eclipse开发中,编码默认是ISO-8859-1,不支持中文.这样我们每次新建文件都要手动修改编码,非常麻烦.其实我们可以设置文件默认编码,今后再新建文件时就不用修改编码了. 1.打开Ecl ...

  7. fedora23深度配置gnome系统环境, 如设置ibus的面板字体大小 以及gedit 自动探测文件字符编码fileencodings

    除了系统桌面gnome, 以及gnome应用程序自带的preferences, 还有很多设置, 没有在preferences, 而是被深度地隐藏在系统中, 这时, 需要安装 dconf-tools: ...

  8. python 读写文件和设置文件的字符编码

    一. python打开文件代码如下: f = open("d:\test.txt", "w") 说明:第一个参数是文件名称,包括路径:第二个参数是打开的模式mo ...

  9. Java Web---登录验证和字符编码过滤器

    什么是过滤器? 在Java Web中,过滤器即Filter.Servlet API中提供了一个Filter接口(javax.servlet.Filter).开发web应用时,假设编写的Java类实现了 ...

随机推荐

  1. 迁移桌面程序到MS Store(3)——开机自启动

    迁移桌面程序的时候,有可能你会遇到这么个需求——开机自启动.Windows传统桌面程序的传统陋习.不论什么奇葩软件都想要开机自启动,默认就给你打开,一开机哐哐哐什么雷,什么企鹅都蹦出来,也不管你用不用 ...

  2. 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 ...

  3. centos下配置nginx遇到的一些基本的坑

    作为一个用.net的渣渣,常年混迹在window平台下,对Linux啥都不懂.随着.net core开源.跨平台后,也开始学习下linux. 在Desktop/Webs下放了一个index.html的 ...

  4. JQuery 知识

    1.修改标签内容: *html( )  相当于innerHTML * text(  )  相当于innerText 2.属性操作: *attr(  )  读/写/添加/设置属性 *removeAttr ...

  5. Python2 指定文件编码格式需要注意的地方

    python2 中默认的编码格式是unicode, 开发人员经常需要根据需要,将python文件的编码格式设置为utf-8,我们可以在python文件的第一行进行设置,加入如下代码: # encodi ...

  6. 复习 C++ 中类的函数指针

    函数指针这种东西,平时工作中基本上不会用到. 那函数指针会用在哪里? 下面是一些基本的用法,根据消息号调到对应的函数: #include <iostream> #include <m ...

  7. 重拾 BFC、IFC、GFC、FFC

    温故知新,巩固基础 从 FC 开始 FC,Formatting Context,格式化上下文,是 W3C CSS2.1 规范中的一个概念,定义的是页面中一块渲染区域,并且有一套渲染规则,它决定了其子元 ...

  8. 关于SVM(support vector machine)----支持向量机的一个故事

    一.预告篇: 很久很久以前,有个SVM, 然后,……………………被deep learning 杀死了…………………………………… . 完结……撒花 二.正式篇 好吧,关于支持向量机有一个故事 ,故事是 ...

  9. Eclipse安装ModelGoon控件(ModelGoon控件反向生成UML)

    Eclipse安装ModelGoon 1 下载ModelGoon到本地,放在eclipse的安装目录下 2 打开Eclipse,点击Help,选择Install new software 3 点击ad ...

  10. 企业域的冗余设计①:DHCP冗余设计(上)

    在许多企业网络中,为了方便客户端IP地址的管理,通常采用的是自动获取的方式向DHCP服务器获得IP地址.为了保证DHCP服务器能够正常稳定地向客户端提供IP地址的租赁,DHCP服务器的冗余设计就显得格 ...