今天遇到了一个小问题,简单研究了一下,同时记录一下。

关于apache的HttpGet\HttpPost请求,做了一次访问,代码如下:

     String url = "http://xxxxxxx";HttpGet httpGet = new HttpGet(url);HttpClient httpClient = new DefaultHttpClient();try {     HttpResponse httpResponse = httpClient.execute(httpGet);       HttpEntity httpEntity = httpResponse.getEntity();//String result = EntityUtils.toString(httpEntity, "utf-8");InputStream is = null;is = httpEntity.getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(is));String result = "";String line = "";while ((line = reader.readLine()) != null) {result = result + line;}System.out.println(result);} catch (Exception e) {e.printStackTrace();} 

结果出现了乱码。立刻对代码进行修改BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));

依旧出现乱码,到底是哪里出问题?

如果用第7行的方式来获取的话就不会有乱码。

第7行的方法很简单,深入研究下实际上也是获取流进行处理,只是在过程中加入了编码处理,那么到底是怎么处理的?

该方法源码如下:

     public static String toString(final HttpEntity entity, final String defaultCharset) throws IOException, ParseException {if (entity == null) {throw new IllegalArgumentException("HTTP entity may not be null");}InputStream instream = entity.getContent();if (instream == null) {return "";}if (entity.getContentLength() > Integer.MAX_VALUE) {throw new IllegalArgumentException("HTTP entity too large to be buffered in memory");}int i = (int)entity.getContentLength();if (i < 0) {i = 4096;}String charset = getContentCharSet(entity);if (charset == null) {charset = defaultCharset;}if (charset == null) {charset = HTTP.DEFAULT_CONTENT_CHARSET;}Reader reader = new InputStreamReader(instream, charset);CharArrayBuffer buffer = new CharArrayBuffer(i);try {char[] tmp = new char[1024];int l;while((l = reader.read(tmp)) != -1) {buffer.append(tmp, 0, l);}} finally {reader.close();}return buffer.toString();} 

可以看见是在InputStreamReader这里处理的。和我处理的地方是一致的,那么还有什么问题?

后来仔细一看发现toString()方法传入的编码方式未必就是最后使用的,这中间还有个判断,就是判断HttpEntity返回的header是否存在charset,不存在才会使用传入的参数。

本来我一直认为这个参数就应该是utf-8,结果用EntityUtils的getContentCharSet方法一获取才发现是GBK。。。

这下就清楚了,修改代码BufferedReader reader = new BufferedReader(new InputStreamReader(is, "gbk"));

这回不是乱码了,不过这部分应该在前面做好判断,先用getContentCharSet获取一下,如果是空再自己设定一个才好。

至于getContentCharSet方法如何实现的,代码如下:

     public static String getContentCharSet(final HttpEntity entity)throws ParseException {if (entity == null) {throw new IllegalArgumentException("HTTP entity may not be null");}String charset = null;if (entity.getContentType() != null) {HeaderElement values[] = entity.getContentType().getElements();if (values.length > 0) {NameValuePair param = values[0].getParameterByName("charset");if (param != null) {charset = param.getValue();}}}return charset;} 

使用apache的HttpGet\HttpPost获取返回内容编码问题相关推荐

  1. Spring mvc 注解@ResponseBody 返回内容编码问题

    @ResponseBody 在@Controller 类方法中能够让字符串直接返回内容. 其返回处理的类是org.springframework.http.converter.StringHttpMe ...

  2. selenium 获取请求返回内容的解决方案

    selenium 获取请求返回内容的解决方案 参考文章: (1)selenium 获取请求返回内容的解决方案 (2)https://www.cnblogs.com/zgq123456/articles ...

  3. python request返回的响应_Python爬虫库requests获取响应内容、响应状态码、响应头...

    首先在程序中引入Requests模块 import requests 一.获取不同类型的响应内容 在发送请求后,服务器会返回一个响应内容,而且requests通常会自动解码响应内容 1.文本响应内容 ...

  4. Qt之QProcess 连续执行多条指令并获取指令返回内容

    简述 system可以连续执行多条指令,只需要使用分号":"分开指令就行,但是system只能返回int类型结果,得不到想要的指令返回内容,且还会阻塞主线程(除非在命令后面加上 & ...

  5. winform-弹窗界面使用DIALOGRESULT判断结果并返回内容,而不使用回调方法,解决主窗体获取不到焦点问题

    确认后,不使用回调返回内容,因为这样的话,对话会影响很多功能问题,比如,获取焦点等,在窗体还没有释放之前,这些方式都无效 private void ConfirmSelectCell(Object i ...

  6. java post xmll_HttpClient发送Post请求,内容格式为xml,并获取响应内容

    ChannelDistributor.xml 内容如下: yisou abcd1234 10010000 00 1).HttpClient发送Post请求,内容格式为xml,并获取响应内容 impor ...

  7. php中files和FILRS,php获取文件内容最后一行示例

    php获取文件内容最后一行示例 复制代码 代码如下: $rs = 'README.md'; $fp = fopen($rs, 'r'); fseek($fp,-1,SEEK_END); $s = '' ...

  8. 从 ClickHouse 到 Apache Doris,腾讯音乐内容库数据平台架构演进实践

    导读:腾讯音乐内容库数据平台旨在为应用层提供库存盘点.分群画像.指标分析.标签圈选等内容分析服务,高效为业务赋能.目前,内容库数据平台的数据架构已经从 1.0 演进到了 4.0 ,经历了分析引擎从 C ...

  9. python执行linux命令返回结果_Python中调用Linux命令并获取返回值

    方法一.使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256/512表示未找到,该方法适用于she ...

最新文章

  1. vs 编译android so
  2. android RefBase、sp、wp
  3. Python学习笔记--2--面向对象编程
  4. Linux系统下安装rz/sz命令及使用说明
  5. SAP ECC6.0内存参数调整和调优
  6. java编程语言大全_JAVA编程语言的基础知识(一)
  7. CentOS6配置部署Zabbix监控
  8. linux sed i 大文件,sed -i   修改链接文件注意事项   破坏了原文件
  9. 转:谷歌离线地图基础
  10. 简 易 版 的 进 程 池 模 型 学 习
  11. linux很容易忽略的rz上传、sz下载命令
  12. linux mount_nodev函数,mount()函数 Unix/Linux
  13. 你敲键盘的声音,出卖了你 | 附开源代码
  14. ios 简单的倒计时验证码数秒过程实现
  15. 不显示参数名_非参数检验 之 非参数卡方检验
  16. 【三维路径规划】基于matlab自适应遗传算法求解单无人机三维路径规划问题【含Matlab源码 214期】
  17. Job for DmServiceDMSERVER.service failed because the control process exited with error code. Se
  18. 服务器文件mdf,升级 .mdf 文件 - Visual Studio (Windows) | Microsoft Docs
  19. Java毕业设计-社区疫情管理小程序
  20. 体检先锋_家居健康小秘笈

热门文章

  1. matlab2012b帮助中字体大小调整
  2. MySQL之架构与历史(二)
  3. The Elder HDU - 5956
  4. (032) Linux之shell流控制for循环
  5. 求二进制数中1的个数
  6. 关于android 图像格式问题
  7. 用饮水机教你什么是RAID [转]
  8. Paint.NET 3.0正式版发布了
  9. python第一周:python初识、流程控制
  10. vGPU作为主流平台的进化之路