`
babyjoycry
  • 浏览: 153610 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java获取页面编码

    博客分类:
  • java
阅读更多
最近研究抓取网页内容,发现要获取页面的编码格式,Java没有现成的实现方法,虽然csdn上有个达人写了一篇文章,附有代码,可惜,我没有找到相关的包,不得已,只好自己动手丰衣足食了。
import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.HTMLCodepageDetector;
import info.monitorenter.cpdetector.io.JChardetFacade;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class WebEncoding {
	private static CodepageDetectorProxy detector = CodepageDetectorProxy
			.getInstance();
	static {

		detector.add(new HTMLCodepageDetector(false));

		detector.add(JChardetFacade.getInstance());

	}
	/**	测试用例
	 * @param args
	 */
	public static void main(String[] args) {
		WebEncoding web=new WebEncoding();
		try {
			System.out.println(web.getCharset("http://www.pujia.com/"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * @param strurl
	 *            页面url地址,需要以 http://开始,例:http://www.pujia.com
	 * @return
	 * @throws IOException
	 */
	public String getCharset(String strurl) throws IOException {
		// 定义URL对象
		URL url = new URL(strurl);
		// 获取http连接对象
		HttpURLConnection urlConnection = (HttpURLConnection) url
				.openConnection();
		;
		urlConnection.connect();
		// 网页编码
		String strencoding = null;

		/**
		 * 首先根据header信息,判断页面编码
		 */
		// map存放的是header信息(url页面的头信息)
		Map<String, List<String>> map = urlConnection.getHeaderFields();
		Set<String> keys = map.keySet();
		Iterator<String> iterator = keys.iterator();

		// 遍历,查找字符编码
		String key = null;
		String tmp = null;
		while (iterator.hasNext()) {
			key = iterator.next();
			tmp = map.get(key).toString().toLowerCase();
			// 获取content-type charset
			if (key != null && key.equals("Content-Type")) {
				int m = tmp.indexOf("charset=");
				if (m != -1) {
					strencoding = tmp.substring(m + 8).replace("]", "");
					return strencoding;
				}
			}
		}

		/**
		 * 通过解析meta得到网页编码
		 */
		// 获取网页源码(英文字符和数字不会乱码,所以可以得到正确<meta/>区域)
		StringBuffer sb = new StringBuffer();
		String line;
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(url
					.openStream()));
			while ((line = in.readLine()) != null) {
				sb.append(line);
			}
			in.close();
		} catch (Exception e) { // Report any errors that arise
			System.err.println(e);
			System.err
					.println("Usage:   java   HttpClient   <URL>   [<filename>]");
		}
		String htmlcode = sb.toString();
		// 解析html源码,取出<meta />区域,并取出charset
		String strbegin = "<meta";
		String strend = ">";
		String strtmp;
		int begin = htmlcode.indexOf(strbegin);
		int end = -1;
		int inttmp;
		while (begin > -1) {
			end = htmlcode.substring(begin).indexOf(strend);
			if (begin > -1 && end > -1) {
				strtmp = htmlcode.substring(begin, begin + end).toLowerCase();
				inttmp = strtmp.indexOf("charset");
				if (inttmp > -1) {
					strencoding = strtmp.substring(inttmp + 7, end).replace(
							"=", "").replace("/", "").replace("\"", "")
							.replace("\'", "").replace(" ", "");
					return strencoding;
				}
			}
			htmlcode = htmlcode.substring(begin);
			begin = htmlcode.indexOf(strbegin);
		}

		/**
		 * 分析字节得到网页编码
		 */
		strencoding = getFileEncoding(url);

		// 设置默认网页字符编码
		if (strencoding == null) {
			strencoding = "GBK";
		}

		return strencoding;
	}

	/**
	 * 
	 *<br>
	 * 方法说明:通过网页内容识别网页编码
	 * 
	 *<br>
	 * 输入参数:strUrl 网页链接; timeout 超时设置
	 * 
	 *<br>
	 * 返回类型:网页编码
	 */
	public static String getFileEncoding(URL url) {

		java.nio.charset.Charset charset = null;
		try {

			charset = detector.detectCodepage(url);

		} catch (Exception e) {

			System.out.println(e.getClass() + "分析" + "编码失败");

		}

		if (charset != null)

			return charset.name();

		return null;

	}
}

文章中用到的lib包,在附件中有可以下载。写出来,希望大家都happy,不用再为这个烦恼。
6
0
分享到:
评论
9 楼 1070482318 2015-12-09  
测试链接:
http://www.jiuye.org/new/career/info/otherRec.html
http://yunnan.bidchance.com/
时无用,求楼主们看看
8 楼 虚客_zZ 2012-05-14  
各位 刚发错了, 7楼代码有问题。
改用现在这个吧。

strencoding = strtmp.substring(inttmp + 7, end).replace(
"=", "").replace("/", "").replace("\"", "")
.replace("\'", "").replace(" ", "");

替换为

String strChasetStart = "=";
String strChasetEnd = " ";
String strCharset = strtmp.substring(inttmp);
int charsetStart = strCharset.indexOf(strChasetStart);
int charsetEnd = strCharset.indexOf(strChasetEnd);
strencoding =  strCharset.substring(charsetStart, charsetEnd).replace(
"=", "").replace("/", "").replace("\"", "").replace("\'", "").replace(" ", "");
7 楼 虚客_zZ 2012-05-14  
strencoding = strtmp.substring(inttmp + 7, end).replace(
"=", "").replace("/", "").replace("\"", "")
.replace("\'", "").replace(" ", "");

替换为

String strChasetEnd = "\"";
String strCharset = strtmp.substring(inttmp);
int charsetEnd = strCharset.indexOf(strChasetEnd);
strencoding =  strCharset.substring(7, charsetEnd).replace(
"=", "").replace("/", "").replace("\"", "").replace("\'", "").replace(" ", "");;
6 楼 虚客_zZ 2012-05-14  
加入meta 为 <meta content="text/html; charset=utf-8" http-equiv="content-type"/

有问题的,,编码抽取为utf-8http-equivcontent-type

原因楼主应该懂的
5 楼 philiphewxu 2012-03-25  
再次调试 发现是我自己程序其他地方的问题 和库没有关系 再次谢谢作者!
4 楼 philiphewxu 2012-03-25  
朋友 用了你的代码 有些问题想请教一下 就是又是读取编码的时间没法控制 有时会卡在哪里非常的久 用了detector.wait(10000)的函数 又出现不停的出现“分析编码出错” 请问应该如何进行超时设置?
3 楼 vanxining 2011-07-19  
不错~
2 楼 xiaoyangok 2011-03-14  
   
1 楼 xiaoqing20 2010-07-29  
大哥你是好人

相关推荐

    获取网页的编码格式(含JAVA源码 )

    获取网页的编码格式(含JAVA源码 ) 含 antlr.jar chardet.jar cpdetector.jar 编码 格式

    获取编码的jar

    java用来获取网页编码的jar,可以用来判定目标链接的页面的编码格式

    java源码包---java 源码 大量 实例

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    获取网页内容的例子[解决中文乱码]

    获取网页内容的例子 绝对可以运行 各种编码的网页都可以正确获取 中文乱码不复存在

    JAVA上百实例源码以及开源项目

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    JAVA上百实例源码以及开源项目源代码

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    Java-图片BLOB的存取DEMO

    20180828开发,提供了三... WEB方式未实现,后期自行研究(可通过JS将前台上传的图片处理成Base64编码格式的字符串, 然后将Base64字符串传参到Controller后进行解码处理后再存储到BLOB字段。 依赖Jar包: ojdbc6.jar

    java源码包4

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    java源码包3

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    网页获取JSON中文返回乱码解决方案(java)

    懒得考虑各种字符编码问题了,用了一个比较暴力的方法,不只中文,所有双字节文字都可以避免乱码问题。

    java源码包2

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    java开源包11

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包6

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包9

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包101

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包4

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包5

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包8

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    获取java-cef源码-numblr:IOStreams和字符编码

    获取java-cef源码介绍和动机 最近在做一个个人项目时,我坐下来为我编写的一个类实现operator&lt;&lt; 。 此类具有文本成员,并且该文本可以以多种编码(ISO-8859-1、UTF-8、Windows 1252 等)存在。 我很快意识到我...

    java开源包10

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

Global site tag (gtag.js) - Google Analytics