`

java获取页面编码【转】

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

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,不用再为这个烦恼。
分享到:
评论

相关推荐

    java字符串编码转换

    ### Java字符串编码转换详解 #### 一、Java 字符串编码转换基础 在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web...

    java URL转PDF文件

    值得注意的是,这个过程中可能会遇到编码问题、样式丢失、图片无法显示等问题,因此实际应用时可能需要更复杂的处理逻辑,比如处理CSS、JavaScript等,以及对异常的妥善处理。 总结一下,Java中将URL转换为PDF涉及...

    java如何正确使用字体编码

    这种方式下,无论是在Java代码中还是在JSP页面中处理从数据库中取出的数据,都需要确保编码的一致性。例如,如果数据库使用的是UTF-8编码,而JSP页面也需要显示这些数据,那么在处理结果集(`ResultSet`)中的数据时...

    java实现rtsp/rtmp转m3u8/flv/hls/mp4等实现web直播和回放

    Java 实现 RTSP/RTMP 转 M3U8/FLV/HLS/MP4 是网络直播和视频回放的重要技术,它涉及到多种协议、工具和格式的交互。在这个场景下,Java 通常作为后端处理服务器,处理来自不同来源(如海康、大华等监控设备)的实时...

    java实现rtsp/rtmp转m3u8/flv/hls/mp4等实现web直播和回放测

    Java 实现 RTSP/RTMP 转 M3U8/FLV/HLS/MP4 等技术在Web直播和回放中的应用是现代互联网流媒体服务的关键组成部分。RTSP(Real-Time Streaming Protocol)和RTMP(Real-Time Messaging Protocol)主要用于实时视频...

    获取编码的jar

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

    java读取网页 生成页面

    在IT领域,特别是Java...总之,使用Java读取网页并生成静态页面涉及到网络编程、输入输出流操作、编码处理、异常管理等多个方面的知识。掌握这些核心技能,不仅能够提升个人编程能力,还能在实际项目中发挥重要作用。

    java+FFmpeg+JavaCV实现无控件HTML页面视频实时预览,录像等,RTSP协议

    Java后端将从RTSP源获取的视频流通过WebSocket推送到前端,`&lt;video&gt;`标签则负责实时解码并显示这些数据。 6. **录像功能**:项目可能使用JavaCV库来捕获视频流,并将其保存为本地文件。FFmpeg可以在此过程中帮助...

    Java Web应用开发 45 课堂案例-应用JavaBean实现编码转换.docx

    首先检查输入的字符串是否为空,然后使用`getBytes()`方法获取字符串的GBK编码字节数组,再通过`new String()`构造一个新的字符串,指定其编码为ISO-8859-1。如果在转换过程中出现异常,返回空字符串。 25-43行:`...

    java 实现整张网页快照

    例如,可以执行一个JavaScript脚本来获取网页的canvas元素,然后调用`toDataURL()`方法将canvas内容转换为Base64编码的图像数据。 5. **处理图像数据**:在Java端接收到Base64编码的图像数据后,将其解码并保存为...

    JSP用户提交页面编码

    ### JSP用户提交页面编码 在Java Web开发中,尤其是使用JSP(JavaServer Pages)技术进行网页开发时,处理用户提交的数据是非常重要的一个环节。其中,数据编码问题尤为关键,因为错误的编码设置可能会导致乱码问题...

    jsp页面文档编码问题

    在Java Web开发中,编码问题始终是一个常见的挑战,特别是涉及到JSP页面时。JSP(JavaServer Pages)是一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,以实现服务器端的数据处理和逻辑控制。然而,由于...

    Jave CED 文档转PDF

    Java CED文档转PDF是一个技术话题,涉及到Java编程语言、CED文档格式以及PDF转换技术。在本文中,我们将深入探讨这些关键概念,并提供一个详细的知识框架。 首先,让我们了解一下CED文档。CED(Computer Editable ...

    根据url来获取页面的截图

    总结一下,根据URL获取页面截图是通过Java的`java.net.URL`和`java.awt.Robot`类实现的,它可以方便地获取并保存网页的视觉表示。这个功能在很多应用场景中都十分有用,比如自动化测试中验证网页布局,或者用于数据...

    JAVA实现注册页面验证码刷新

    JavaScript库如jQuery提供了方便的API来发送异步请求到服务器获取新验证码,并更新页面上的验证码图片。 5. **响应与重定向**: - **HTTP响应**:服务器生成新验证码后,会构建一个包含验证码的HTTP响应,并返回给...

    java编码规范

    ### Java编码规范详解 #### 一、概述 Java作为一种广泛使用的编程语言,其代码质量直接影响着软件项目的可维护性、可读性和可扩展性。为了提高团队协作效率,确保代码风格一致并符合最佳实践,制定统一的Java编码...

    java icepdf转一张或多张图片

    Java ICEpdf是一个开源的PDF库,它允许开发者在Java应用程序中...以上就是使用Java ICEpdf库进行PDF转图片的基本步骤和注意事项。通过熟练掌握这些知识点,你可以在自己的项目中实现高效且准确的PDF到图片转换功能。

    java中文问题分析

    Java编程中的中文问题源于字符编码的不匹配,主要体现在以下几个方面: 1. **操作系统与Java的编码差异**:早期的计算机系统多采用单字节编码,如ASCII,但随着Unicode的普及,Java语言内部使用Unicode编码,以支持...

    java中文乱码之解决URL中文乱码问题的方法

    - **一次转码**:使用`encodeURI()` 对URL进行编码,然后在服务器端使用适当的解码方法,如Java中的`new String(name.getBytes("ISO-8859-1"), "UTF-8")`,确保从ISO-8859-1转回UTF-8。 - **二次转码**:先使用`...

    java编码的网上购物系统

    在Struts框架中,JSP用于前端展现,Servlet 用于控制,Action 用于处理前端页面JSP发来的请求,请求参数通过ActionForm进行传递,Action 在获得请求后通过调度业务系统提供的Spring service bean做处理,最后将处理结果...

Global site tag (gtag.js) - Google Analytics