java获取页面编码

文章出自:http://babyjoycry.javaeye.com/blog/587527 在此感谢原作者...\(^o^)/~

最近研究抓取网页内容,发现要获取页面的编码格式,Java没有现成的实现方法,虽然csdn上有个达人写了一篇文章,附有代码,可惜,我没有找到相关的包,不得已,只好自己动手丰衣足食了。

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; 

import cpdetector.io.CodepageDetectorProxy;
import cpdetector.io.HTMLCodepageDetector;
import cpdetector.io.JChardetFacade; 

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

  static {
    detector.add(new HTMLCodepageDetector(false));
    detector.add(JChardetFacade.getInstance());
  } 

  /**
    * 测试用例
    *
    * @param args
    */
  public static void main(String[] args) {
    PageEncodeDetector web = new PageEncodeDetector();
    try {
      System.out.println(web.getCharset("http://www.baidu.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; 

  } 

}

  需要下载cpdetector_1.0.5.jar 和 chardet.jar

时间: 2024-10-09 03:05:37

java获取页面编码的相关文章

正则获取页面编码 判断当前页面的编码

//根据指定网址判断当前页面的编码 static public string GetWebpageCode(string url) { string charSet = ""; WebClient myWebClient = new WebClient(); myWebClient.Credentials = CredentialCache.DefaultCredentials; //从资源下载数据并返回字节数组.(加@是因为网址中间有"/"符号) byte[] m

java 获取页面中的 a 标签 的 href 实例

Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*(\"|\')?(.*?)[\"|\'|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher("<div class=\"related-tags\">\n" + " <span>相关主题推荐:</span>\n"

Java获取字符串编码方式

直接下载吧: http://files.cnblogs.com/files/xiluhua/BytesEncodingDetectTool.rar

java获取常见文本文件的编码 解决乱码问题

乱码问题的产生一般是,由字节流转字符流的时候,读文件的编码与文件的系统编码不一致造成的. 解决方式:先自动判断文件系统编码类型,然后读的时候用这个类型去读就ok了. 自动判断文件系统编码类型代码如下, 地址:http://www.cnblogs.com/java0721/archive/2012/07/21/2602963.html java获取常见文本文件的编码 解决乱码问题

Java获取访问者Ip并限制Ip访问页面

原文链接:https://www.zjhuiwan.cn/info/20200330/4006602464505049.html 最近遇到一个需求,一个只能内网访问的网站,需要限制ip访问.就是网站内的部分文章只有白名单内的ip才能打开.因为是静态化的网站,所有文章都是静态html页面.所以首先想到的就是直接js获取访问者ip然后再判断是否在白名单内,不在白名单内就到没有权限页面. 但是JS获取内网Ip还是比较麻烦的,查到几个方法最后试了都不行. 记录下查到的几个方法和最后实现的方法. JS获取

微信实现定位城市并获取城市编码

最近在做一个项目是将用户的当前所在市县定位出来并展示在手机端页面,同时还要获取到该市县的城市编码从而进行数据过滤,这里重点讲定位城市及获取城市编码 前端页面代码: 首先引用腾讯地图的一个js <script type="text/javascript" src="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js" ></script> 同时在页面加载

java获取天气预报的信息

运行效果: 主要功能: 1,jsp页面输入省份和城市 根据条件获取当地的天气信息 2,java代码 利用第三方的省份和城市的路径地址 本工程主要实现java获取天气预报的信息步骤1,创建工程weatherDemo2,创建包结构3,创建类4,访问第三方接口 打开主机方法5,获取省份id方法6,获取市id方法7,获取天气的方法8,编写servlet9,发布运行 java代码 创建WeatherDemo类 /** * @version 1.0 * @author ren * 天气预报的核心接口 * *

java 获取公网(外网IP)很实用!

package com.lovo.util; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class PublicInterIp { /** * @param args * @throws Exception */ public S

转-Eclipse,tomcat及jsp页面编码的设定解决的中文乱码问题

一.Eclipse下编码的设定(在myeclipse下设定方法类似) 1.window -> Preferences -> general -> Workspace -> Text file encoding(这里是设置工作去的编码) 选择Other,将编码改变为UTF-8,这样以后新建立工程其属性对话框中的Text file encoding即为UTF-8. 2.window -> Preferences -> general -> Content Types(