`
ningwuyu
  • 浏览: 48918 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

httpclient对url编码的处理方式

    博客分类:
  • java
阅读更多
HttpClient是Apache基金下jakarta commons项目中的一个小项目,该项目封装了对远程地址下载的一些功能,最新版本为3.0。该项目地址:http://jakarta.apache.org/commons/httpclient

最近在编写Spider的时候就用到了HttpClient。在使用过程中发现一个有趣现象:有些URL的编码方式是utf-8,有些URL的编码方式是gbk。他总能够正确识别,但是有些他又不能识别(抓取回来后是乱码)。调用的是:httpMethod.getResponseBodyAsString();  方法。

在进行进一步分析时,发现他对在http头信息中有charset描述的就正确正常识别。如:

HTTP/1.1 200 OK   
Connection: close   
Content-Type: text/html; charset=utf-8  
Set-Cookie: _session_id=066875c3c0530c06c0204b96db403560; domain=iteye.com; path=/   
Vary: Accept-Encoding   
Cache-Control: no-cache   
Content-Encoding: gzip   
Content-Length: 8512  
Date: Fri, 16 Mar 2007 09:02:52 GMT   
Server: lighttpd/1.4.13  

而没有charset描述信息时,就会是乱码。再查看相关文档时,可以指定URL的编码方式。如:HttpClientParams.setContentCharset("gbk");,指定了编码后,就能够正确识别对应编码的URL了。问题出现了,因URL编码不一样,Spider不可能把URL的编码方式写死。并且只有在抓取回来后才知道编码是否正确。于是再仔细研究一下httpclient的源代码,发现他使用编码的顺序是:http头信息的charset,如果头信息中没有charset,则查找HttpClientParams的contentCharset,如果没有指定编码,则是ISO-8859-1。

/**  
   * Returns the character set from the Content-Type header.  
   *   
   * @param contentheader The content header.  
   * @return String The character set.  
   */  
  protected String getContentCharSet(Header contentheader) {   
      LOG.trace("enter getContentCharSet( Header contentheader )");   
      String charset = null;   
      if (contentheader != null) {   
          HeaderElement values[] = contentheader.getElements();   
          // I expect only one header element to be there   
          // No more. no less   
          if (values.length == 1) {   
              NameValuePair param = values[0].getParameterByName("charset");   
              if (param != null) {   
                  // If I get anything "funny"    
                  // UnsupportedEncondingException will result   
                  charset = param.getValue();   
              }   
          }   
      }   
      if (charset == null) {   
          charset = getParams().getContentCharset();   
          if (LOG.isDebugEnabled()) {   
              LOG.debug("Default charset used: " + charset);   
          }   
      }   
      return charset;   
  }   
  
  
  /**    
  * Returns the default charset to be used for writing content body,     
  * when no charset explicitly specified.    
  * @return The charset    
  */     
public String getContentCharset() {      
     String charset = (String) getParameter(HTTP_CONTENT_CHARSET);      
     if (charset == null) {      
         LOG.warn("Default content charset not configured, using ISO-8859-1");      
         charset = "ISO-8859-1";      
     }      
     return charset;      
}     
这个该死的iso-8859-1害了多少人啊(Tomcat对提交的数据处理默认也是iso-8859-1)!!

经过仔细思考后,决定httpclient再封装一次,思路如下:

先不设定HttpClientParams的charset;
executemethod后,再检查http头信息中的charset是否存在; 
如果charset存在,返回httpMethod.getResponseBodyAsString();  ;
如果charset不存在,则先调用httpMethod.getResponseBodyAsString();得到html后,再分析html head的meta的charset <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">;
从meta中分析出charset后,设置到HttpClientParams的contentCharset;
再调用httpMethod.getResponseBodyAsString(),并返回该值。
经过以上思路处理后,发现抓回来的URL再也没有乱码了。爽!

以上步骤中,就是第四步稍微麻烦一些,不过,也可以利用第三方的html paser工具来分析meta的charset!

分享到:
评论

相关推荐

    基于httpClient的文件编码导入系统

    在IT行业中,基于httpClient的文件编码导入系统是一个常见的应用场景,主要涉及到网络通信和数据处理两个核心领域。HttpClient是Apache开源组织提供的一款强大的HTTP客户端库,它允许开发者在Java环境中发送HTTP请求...

    每个web开发者都应该知道的url编码知识

    通过对URL编码机制的深入了解,可以有效避免一系列潜在的技术问题,确保Web应用程序在各种环境下的稳定性和可靠性。特别是在现代Web开发中,随着国际化内容的增多和技术复杂性的提高,掌握URL编码的最佳实践变得尤为...

    HttpClient、乱码解决:实例

    1. 字符编码不一致:服务器和客户端对字符编码的理解不同,可能导致接收的数据出现乱码。 2. 编码转换不当:在网络传输过程中,数据可能需要进行编码转换,如果处理不当也会引发乱码。 三、解决乱码问题的方法 1. ...

    Java HttpClient 全部的jar包

    在HttpClient中,这个库用于处理URL编码和解码,以及在HTTP请求头或参数中可能涉及到的其他编码问题。 3. `commons-collections-3.2.jar`: Apache Commons Collections提供了对Java集合框架的扩展和增强,包括集合...

    HTTPCLIENT

    3. **URL编码解码**:在构建HTTP请求时,非ASCII字符或特殊字符需要进行URL编码,以符合URL的规范。 总结来说,HTTPCLIENT是一个强大的Java HTTP客户端库,与日志框架(如Log4j)结合使用,可以实现详细的请求跟踪...

    httpclient-4.5所需jar包

    7. **commons-codec-x.x.jar**:提供了常见的编码和解码算法,如Base64、URL编码等,HTTPClient在处理编码问题时会用到。 8. **其他可能的依赖库**:根据实际需求,可能还需要包括其他Apache Commons库(如...

    httpclient所需lib

    2. **commons-codec-1.6.jar**:这是一个编码解码库,HttpClient依赖它来处理URL编码、Base64编码等,它是进行网络通信时数据编码的关键库。 3. **httpcore-4.2.1.jar**:这是HTTP Core库,提供了HTTP协议的基础...

    httpclient4.3工具类

    9. **异常处理**:`httpclientUtils`可能会包含对HttpClient抛出的各种异常的处理逻辑,如`IOException`、`HttpException`等,以提供更友好的错误信息和处理方案。 10. **线程安全**:为了适应多线程环境,`...

    httpclient jar

    2. `commons-codec-1.3.jar`: 这个库提供了各种编码解码工具,如Base64编码、URL编码等,HttpClient依赖它来处理一些数据编码问题。 3. `commons-logging-1.1.1.jar`: Apache Commons Logging是一个轻量级的日志...

    httpclient

    5. **请求与响应处理**:HttpClient允许自定义请求头,处理响应头,以及对请求和响应实体内容的编码和解码。 **三、使用HttpClient的步骤** 1. **创建HttpClient实例**:根据项目需求配置连接管理器、重试策略等。...

    org.apache.commons.httpclient相关资源包

    在HttpClient中,这个库用于处理URL编码、MD5哈希等任务,是网络通信中数据转换的重要组成部分。 2. **commons-httpclient-3.0.jar**:这就是Apache HttpClient的核心库,提供了HTTP客户端接口和实现。这个版本(3.0...

    HttpClient3.1.jar

    3. **commons-codec.jar**:Apache Commons Codec库提供了各种编码和解码算法,如Base64、URL编码和解码以及电话号码编码。HttpClient3.1依赖于这个库来处理HTTP请求中的编码问题,例如在URL参数或表单数据中进行...

    httpclient-4.5.2.jar

    在HTTP通信中,编码和解码操作非常常见,比如URL编码、表单数据编码等,Commons Codec为HttpClient提供了这些功能的支持。 最后,`commons-logging-1.2.jar`是Apache Commons Logging库,它提供了一个抽象的日志...

    httpclient相关jar包

    在HTTPClient中,`commons-codec`库用于处理URL编码、HTTP头信息和身份验证的加密过程,如Basic Auth和Digest Auth。例如,当发送一个HTTP请求时,如果需要进行身份验证,`commons-codec`会将用户名和密码编码为Base...

    HttpClient 功能jar包

    在HttpClient中,这个库被用来处理HTTP请求和响应中的编码问题,如URL编码、身份验证所需的Base64编码等。在进行网络通信时,正确处理编码是确保数据完整性和正确性的关键步骤。 3. **commons-logging.jar**:这是...

    commons-httpclient-3.1jar

    HttpClient库包含对URL编码和解码的支持,确保在处理含有特殊字符的URL时能正确传输。 6. **请求和响应处理**: 用户可以自定义请求头,添加额外的信息,如Content-Type、Accept等。同时,HttpClient可以解析...

    httpclient4.3 封装工具类

    这些方法会处理URL编码、参数拼接、Header设置等细节,让开发者可以专注于业务逻辑,而不用关心底层HTTP交互的复杂性。 5. **响应处理**:HttpClient 4.3封装工具类还可能包括对HTTP响应的处理,如获取响应状态码、...

    httpClient jar

    3. **commons-codec-1.3.jar**:此库提供了各种编码和解码算法,例如Base64编码、URL编码和电话号码的E.164格式化。HttpClient在处理URLs、编码请求参数或者与服务器进行编码通信时可能会用到这些功能。 使用...

    HttpClient

    此外,`HttpClient` 还支持重定向处理、代理服务器以及自定义请求头等功能。 #### 二、安装与配置 在使用 `HttpClient` 之前,首先需要下载并安装必要的组件: 1. **下载 HttpClient**:可以从官方网站 ...

    Httpclient依赖包

    3. **异常处理**:HttpClient抛出的异常通常包含了丰富的错误信息,通过捕获和处理这些异常,可以更有效地调试和解决问题。 4. **性能优化**:合理配置连接池大小、超时时间、重试策略等参数,可以显著提升...

Global site tag (gtag.js) - Google Analytics