`

自动检测文本的字符集

阅读更多

自动检测文本的字符集
(Java port of Mozilla charset detector 工具的使用方法)

 

Java port of Mozilla charset detector是Mozilla组织开发的用于浏览器自动识别网页字符集的工具的一个JAVA实现。Mozilla有关该工具的地址是:http://www.mozilla.org/projects/intl/chardet.html
本JAVA实现版本的地址是:http://sourceforge.net/projects/jchardet/
在JAVA系统开发中,经常遇到字符集的问题(其实不是JAVA的问题,而是软件行业的历史遗留问题),在时候不知道文本内容的编码方式,在处理的时候出现一些意想不到的问题,通过使用此工具,虽不能百分百准确检测字符集,但还可将就用用。此工具检测效率不是很高,使用后对系统性能会有一点影响,对性能要求很高的系统谨慎使用。

下面是如何使用此工具的一个简单说明:

第一步:
在需要检测字符集的类实现接口nsICharsetDetectionObserver,需要实现其中的一个方法:Notify()。该方法会在检测结束的时候被调用并返回检测的字符集(不论对错)。

接口代码如下:

package org.mozilla.intl.chardet ;

import java.lang.* ;

public interface nsICharsetDetectionObserver {
  public void Notify(String charset) ;
}

 


第二步:
初始化nsDetector类,然后对字符串流进行检测,如果检测到有非ASCII的字符,则调用nsDetector的DoIt()方法进行检测。


第三步:
当字符串流处理结果后,调用nsDetector的DataEnd()方法,检测引擎会向调用者返回检测到的字符集。下面是一个调用该工具检测指定URL的页面编码方式的例子:

 

package org.mozilla.intl.chardet ;
import java.io.* ;
import java.net.* ;
import java.util.* ;
import org.mozilla.intl.chardet.* ;

public class HtmlCharsetDetector {

    public static boolean found = false ;

    public static void main(String argv[]) throws Exception {

	if (argv.length != 1 && argv.length != 2) {

	  System.out.println("Usage: HtmlCharsetDetector <url> [<languageHint>]");

	  System.out.println("");
	  System.out.println("Where <url> is http://...");
	  System.out.println("For optional <languageHint>. Use following...");
	  System.out.println("		1 => Japanese");
	  System.out.println("		2 => Chinese");
	  System.out.println("		3 => Simplified Chinese");
	  System.out.println("		4 => Traditional Chinese");
	  System.out.println("		5 => Korean");
	  System.out.println("		6 => Dont know (default)");

	  return ;
	} 


	//初始化nsDetector() ;
	int lang = (argv.length == 2)? Integer.parseInt(argv[1]) : nsPSMDetector.ALL ;
	nsDetector det = new nsDetector(lang) ;

	//设置观察者...
	//如果检测出了字符集,则会调用Notify()方法.

	det.Init(new nsICharsetDetectionObserver() {
		public void Notify(String charset) {
		    HtmlCharsetDetector.found = true ;
		    System.out.println("CHARSET = " + charset);
		}
    	});

	URL url = new URL(argv[0]);
	BufferedInputStream imp = new BufferedInputStream(url.openStream());
	
	byte[] buf = new byte[1024] ;
	int len;
	boolean done = false ;
	boolean isAscii = true ;
	   
	while( (len=imp.read(buf,0,buf.length)) != -1) {

		//检测字符串流中是否只包含ASCII
		if (isAscii)
		    isAscii = det.isAscii(buf,len);

                //如果包含非ASCII字符,则调用DoIt()方法进行检测
		if (!isAscii && !done)
 		    done = det.DoIt(buf,len, false);
	}
	det.DataEnd();

	if (isAscii) {
	   System.out.println("CHARSET = ASCII");
	   found = true ;
	}

	if (!found) {
	   String prob[] = det.getProbableCharsets() ;
	   for(int i=0; i<prob.length; i++) {
		System.out.println("Probable Charset = " + prob[i]);
	   }
	}
    }
}

 

 

下面是检测文本文件字符编码的例子,跟检测URL的差不多,只改了输入流获取方式:

package com.iteye.sheng.util.tools;

import java.io.* ;
import java.net.* ;
import java.util.* ;
import org.mozilla.intl.chardet.* ;

public class FileCharsetDetector {

  public static boolean found = false ;

  public static void main(String argv[]) throws Exception {

    if (argv.length != 1 && argv.length != 2) {

      System.out.println("Usage: FileCharsetDetector <file> [<languageHint>]");

      System.out.println("");
      System.out.println("Where <file> is C:/xxxxx.txt");
      System.out.println("For optional <languageHint>. Use following...");
      System.out.println("        1 => Japanese");
      System.out.println("        2 => Chinese");
      System.out.println("        3 => Simplified Chinese");
      System.out.println("        4 => Traditional Chinese");
      System.out.println("        5 => Korean");
      System.out.println("        6 => Dont know (default)");

      return ;
    }


    //初始化nsDetector() ;
    int lang = (argv.length == 2)? Integer.parseInt(argv[1]) : nsPSMDetector.ALL ;
    nsDetector det = new nsDetector(lang) ;

    //设置观察者...
    //如果检测出了字符集,则会调用Notify()方法.
    det.Init(new nsICharsetDetectionObserver() {
      public void Notify(String charset) {
        FileCharsetDetector.found = true ;
        System.out.println("CHARSET = " + charset);
      }
    });

    String filename = argv[0];
    BufferedInputStream imp = new BufferedInputStream(new FileInputStream(filename));
    
    byte[] buf = new byte[1024] ;
    int len;
    boolean done = false ;
    boolean isAscii = true ;
       
    while( (len=imp.read(buf,0,buf.length)) != -1) {

      //检测字符串流中是否只包含ASCII
      if (isAscii)
        isAscii = det.isAscii(buf,len);
      
      //如果包含非ASCII字符,则调用DoIt()方法进行检测
      if (!isAscii && !done)
        done = det.DoIt(buf,len, false);
    }
    det.DataEnd();

    if (isAscii) {
      System.out.println("CHARSET = ASCII");
      found = true ;
    }

    if (!found) {
      String prob[] = det.getProbableCharsets() ;
      for(int i=0; i<prob.length; i++) {
        System.out.println("Probable Charset = " + prob[i]);
      }
    }
  }
}

 

 

  • FCD.jar (3.1 KB)
  • 下载次数: 18
分享到:
评论
1 楼 sea0108 2011-11-20  

相关推荐

    UnicodeCharsetDetector:文本文件Unicode字符集检测器

    UnicodeCharsetDetector 文本文件Unicode字符集检测器:带或不带BOM的UTF-7,UTF-8,UTF-16,UTF-32。

    Java自动识别文件字符编码工具类.rar

    Java自动识别文件字符编码工具类 参考博客 https://blog.csdn.net/superbeyone/article/details/103036914 使用方式: String encode = EncodingDetect.getFileEncode(geoJsonFile); log.info("系统检测到文件[ {}...

    CreateTextData:自动生成OCR的文本数据集工具

    special_auto.py :自动生成具有所有特殊字符的数据集。 python3 special_auto.py create_lmdb_dataset.py :从生成的图像+ label.txt文件生成Lmdb文件。 *将图像文件夹+ label.txt放入数据/ * python3 create_...

    论文研究 - 预处理用于OCR转换的公共标牌图像

    在本文中,我们提出了一种新颖的方法来增强智能电话相机在室外和室内以及在各种光照条件下捕获的公共招牌的OCR... 此外,我们建议使用一种方法来自动将ROI(感兴趣区域)分配给检测到的招牌,以更好地识别文本信息。

    串口中断服务函数集文本文件

    输出一个无符号字符数的十进制表示,必须标示小数点的位置,自动删除前面无用的零 //putint(uint ui,uchar j);输出一个无符号整型数的十进制表示,必须标示小数点的位置,自动删除前面无用的零 //delay(unsigned char ...

    I2 Localization本地化.zip

    设置文本自动显示为大写,小写,上限,标题大小等。 在游戏动态翻译 Easy API在运行时翻译聊天消息和其他动态文本 应用程序名称和商店本地化 翻译游戏名称所有语言,并在Android / IOS商店中显示您的游戏支持哪些...

    QuickEdit Pro 1.4.3.apk

    ✓自动检测字符集和编码。 ✓自动缩进新行。 ✓各种字体和大小。 ✓预览HTML,CSS和降价文件。 ✓打开最近打开或添加的文件集合中的文件。 ✓能够在有根设备上编辑系统文件。 ✓从FTP,Google Drive,Dropbox和One...

    基于数字图像处理和深度学习的车牌定位,字符分割和字符识别项目源码+说明+论文.zip

    参考自然场景下的文本检测方法和车牌中的字符分布特点,对车牌候选区域提取改进的最大稳定极值区域,通过使用非极大值抑制和区域校正得到字符候选人,通过字符判断分类器和字符搜索,实现非车牌区域的滤除和车牌区域...

    oracle数据库修复

    支持多种字符集之间的转换,能够正确的转换CLOB、NCLOB、NVARCHAR2列类型的数据到指定的字符集。 自动检测数据文件的表空间号和文件号 导出的数据格式包括纯文本和DMP文件两种。以纯文本导出时,能够自动生成建表...

    Oracle数据库恢复工具Oracle Database Unloader(ODU)3.09

    支持多种字符集之间的转换,能够正确的转换CLOB、NCLOB、NVARCHAR2列类型的数据到指定的字符集。 ODU全面支持64位系统,支持超过4G大小的数据文件。 支持复制操作系统命令不能复制的坏文件 模拟oracle的dump块...

    TOTextInputChecker(iPhone源代码)

    2、限制输入文本长度,输入字符集; 3、当设置为整型模式、浮点模式或金额模式时,限制输入最大最小值,限制输入非法数字; 4、已兼容中文输入法,并匹配最大长度; 5、已对复制粘贴来的文字进行了长度、输入字符...

    Charset detector-开源

    用于自动检测给定文本或文件的字符集的库。 将分析输入缓冲区以猜测使用的编码。 结果(字符集名称或代码页ID)可以用作字符集对话的控制参数。 使您的程序知道Unicode!

    cz2cz tools-开源

    cz2cz 是用于在各种编码字符集(ISO-8859-2、Win-1250、UTF-8...)之间转换文本文件的软件。 主要功能是自动检测文本文件中使用的字符集。 仅限捷克语(仅对 cz 用户有用)。

    中文转拼音实例-基于字符的卷积神经网络-超短文本分类-主要代码为lc222的github项目,有HTTP访问等.zip

    - **自然语言处理**:如文本分类、情感分析、词性标注等,尽管这些任务通常结合其他类型的网络结构(如循环神经网络)。 ### **7. 发展与演变** CNN的概念起源于20世纪80年代,但其影响力在硬件加速(如GPU)和大...

    WEB前端助手(FeHelper)_v2019.09.0320.crx

    JSON自动美化(页面自动检测并格式化) JSON手动美化(粘贴文本、手动格式化) JSON比对工具(支持左右两个JSON片段进行键值对比较) 字符串编解码(Unicode/UTF8/Base64/MD5) 代码美化工具...

    易语言辅助模块

    子程序 快速寻找文件, 文本型, 公开, 成功返回(文件全路径),失败返回(空文本) .参数 欲寻找的文件路径, 文本型, , 如:C:\WINDOWS\system32 或 C:\ .参数 欲寻找的文件名, 文本型, , 如:1.exe , 2.dll.....等,...

    SurfFind-开源

    该项目是TabTextFinder(http://sourceforge.jp/projects/tabtextfinder/simple/)的一个副本,专用于具有自动编码检测功能的日语字符集。 此克隆忽略自动编码检测,并且默认情况下使用默认编码。

    易语言模块大全(共775个模块)

    CPU占用率检测模块(1.0).zip ceshi (1.0).zip 磁盘相关(1.0).zip 创建快捷方式模块2.2(1.0).zip 创建任意目录 1.0.0.2(1.0).zip 常用模块(1.0).zip 窗口整容师(1.1).zip 窗口整容师(1.0).zip 传世私服注册(1.0).zip ...

Global site tag (gtag.js) - Google Analytics