`

自动检测文本的字符集

阅读更多

自动检测文本的字符集
(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  

相关推荐

    python库 解析xml和文本字符集探测

    在Python编程环境中,处理XML和文本字符集探测是常见的任务,尤其在数据处理和解析大量文本数据时。这里我们将深入探讨Python 2.6环境下如何利用特定库来完成这些任务。 首先,我们关注的是`BeautifulSoup`库,这是...

    文本/字符检测定位数据集,中英文混合

    这个数据集名为"文本/字符检测定位数据集,中英文混合",是专门为训练和评估文本检测与识别算法设计的。它包含了从SOSO街景地图自行抓取的大量图像,这些图像具有丰富的多样性,涵盖了道路交通指示牌、路边立柱广告...

    关于GBK和Unicode字符集转换乱码问题

    在计算机科学与互联网技术中,字符集是一种用于表示文本的标准集合,不同的字符集适用于不同的语言环境。本文将深入探讨GBK与Unicode这两种字符集之间的转换问题,特别是在转换过程中出现乱码的原因及解决方法。 ##...

    数据集-文本检测数据集-MSRA-包含标注信息

    这些模型通过学习特征表示,能够自动检测并识别图像中的文本。 为了优化模型性能,研究人员可能会进行数据增强,如翻转、旋转、缩放等,以增加模型对不同情况的泛化能力。同时,评估指标也是关键,常见的有精确度...

    VB 自动删除文本中的非法字符

    非法字符通常包括但不限于控制字符、特殊符号、非ASCII字符或者超出预定义字符集的字符。在VB中,我们可以通过字符串操作函数来实现这个功能。以下是一些关键的知识点: 1. **字符串变量和常量**:首先,我们需要...

    gedit设置中文字符集

    - 右侧的列表显示了gedit自动检测编码时所考虑的字符集。 - 双击列表中的任意位置,将弹出一个对话框,允许您添加新的编码选项。 - 在对话框中,输入需要支持的编码类型,如`GBK`、`GB2312`、`GB18030`等,并点击...

    java 获取文件字符集编码依赖包

    `cpdetector`是Java中一个常用的库,用于自动检测文件的字符集编码。这个库能够帮助开发者识别文件的编码类型,从而避免在处理文本时出现乱码问题。 `cpdetector`库主要由`com.joestelmach`组织开发,它包含了多种...

    Base64文本字符串解码编码双向解析转换工具

    - 自动检测和处理UTF8编码,确保解码后的文本正确无误。 - 可能提供批量处理功能,一次性处理多个Base64编码的字符串。 - 可能有错误检查机制,防止非Base64格式的字符串输入,或在解码过程中遇到错误。 - 显示原始...

    c#检测文本文件编码的方法

    检测文本文件的编码方式是非常重要的,因为不同的编码方式对应不同的字符集和解析方式。 通过使用C#语言,可以使用各种方法来检测文本文件的编码方式。例如,可以使用System.Text.Encoding类来检测文本文件的编码...

    Web开发字符集相关知识

    Web开发中的字符集和字符编码是确保正确显示和处理文本数据的关键因素,特别是在涉及多语言和特殊字符时。本文将深入探讨字符集、字符编码、Web浏览器端的处理方式、Web服务器端的处理方式以及数据库的字符编码设置...

    T3特殊字符检测

    1. **字符集与编码**:理解不同的字符集(如ASCII、Unicode、UTF-8等)及其编码方式,因为不同编码可能导致某些字符被视为特殊字符。 2. **正则表达式**:使用正则表达式进行特殊字符匹配,例如,检测非打印字符、...

    EAST文本检测

    EAST(Efficient and Accurate Scene Text Detection)是一种高效且准确的场景文本检测算法,其主要目标是自动检测图像中的文本。在图像处理和计算机视觉领域,OCR(Optical Character Recognition,光学字符识别)...

    字符集编码转换工具

    1. 自动检测编码:分析文件内容,尝试识别其原始编码。 2. 手动选择编码:用户可以根据自己的知识选择源文件的编码。 3. 转换为多种编码:支持将文件转换为多种常见字符编码格式,如UTF-8、GBK、GB2312等。 4. 预览...

    OCR数据集——文本检测、文本识别

    4. 多语言支持:这个数据集包括中文、英文和繁体字,这意味着模型需要处理不同语言的字符集和书写规则。中文OCR需要识别汉字的复杂结构,英文OCR则关注字母和数字的组合,而繁体字的识别则需要识别更多的传统字符...

    天池MTWI 2018:网络图像的文本检测.zip

    文本检测的目标是精确框出图像中的每个字符或单词,为后续的文本识别、信息提取和理解铺平道路。 二、OCR(Optical Character Recognition) OCR技术是文本检测的基础,它将图像中的文字转换成可编辑的电子文本。在...

    Python-Pytorch实现的CRAFT文本检测器

    CRAFT(Character Region Awareness for Text Detection)是一种高效且精确的文本检测算法,它在图像处理领域被广泛应用于自动识别和定位图像中的文本。该算法的核心是通过检测单个字符及其相互关系来确定文本区域,...

    批量编码转化工具(实现文件编码的自动检测)

    文件编码是用来表示文本字符的规则,常见的有ASCII、GB2312、GBK、UTF-8等。不同的编码方式决定了字符集的大小和覆盖的字符范围。例如,ASCII只包含英文字符,而GBK则包含了更多的中文字符。UTF-8是一种多字节编码...

    检测字符和网站编码的类

    Java提供了强大的字符集支持,如`java.nio.charset`包中的`Charset`类,用于处理字符编码和解码。这个类可能实现了自己的检测算法,通过对字节序列的分析来确定其对应的字符编码。 这个类可能包含以下功能: 1. **...

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

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

Global site tag (gtag.js) - Google Analytics