2014-04-12 23:24 12366人阅读 评论(10) 收藏 举报
分类:
【Android 基础】(15)

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23562939

问题描述:从网络中抓取html页面进行解析,解析后发现产生部分中文乱码。

由来:制作csdn客户端时产生 , http://blog.csdn.net/lmj623565791/article/details/23532797  (Java环境下,使用控制台打印出是没有乱码)

于是立马检查从服务器读取的代码:

  1. <span style="font-size:18px;">  /**
  2. * 返回该链接地址的html数据
  3. *
  4. * @param urlStr
  5. * @return
  6. * @throws CommonException
  7. */
  8. public static String doGet(String urlStr) throws CommonException
  9. {
  10. StringBuffer sb = new StringBuffer();
  11. try
  12. {
  13. URL url = new URL(urlStr);
  14. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  15. conn.setRequestMethod("GET");
  16. conn.setConnectTimeout(5000);
  17. conn.setDoInput(true);
  18. conn.setDoOutput(true);
  19. if (conn.getResponseCode() == 200)
  20. {
  21. InputStream is = conn.getInputStream();
  22. int len = 0;
  23. byte[] buf = new byte[1024];
  24. while ((len = is.read(buf)) != -1)
  25. {
  26. sb.append(new String(buf, 0, len, "UTF-8"));
  27. }
  28. is.close();
  29. } else
  30. {
  31. throw new CommonException("访问网络失败!");
  32. }
  33. } catch (Exception e)
  34. {
  35. throw new CommonException("访问网络失败!");
  36. }
  37. return sb.toString();
  38. }
  39. </span>

发现可能是由于我采用字节流从网络读取数据,且每次读取1024个字节,读取完成后能后强制转化为字符串,又因为使用编码为UTF-8,UTF-8是一种变长码(英文1个字节,中文两个字节),所以1024可能会造成刚好截取了某个汉字的一半(前一个字节),然后转化为字符串时造成乱码。唯一不理解的在java环境下,使用控制台打印出是没有乱码的。如果你有不同的理解欢迎留言探讨。

于是把读取数据的代码从字节流改成字符流,修改后的代码为:

  1. <span style="font-size:18px;">  /**
  2. * 返回该链接地址的html数据
  3. *
  4. * @param urlStr
  5. * @return
  6. * @throws CommonException
  7. */
  8. public static String doGet(String urlStr) throws CommonException
  9. {
  10. StringBuffer sb = new StringBuffer();
  11. try
  12. {
  13. URL url = new URL(urlStr);
  14. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  15. conn.setRequestMethod("GET");
  16. conn.setConnectTimeout(5000);
  17. conn.setDoInput(true);
  18. conn.setDoOutput(true);
  19. if (conn.getResponseCode() == 200)
  20. {
  21. InputStream is = conn.getInputStream();
  22. InputStreamReader isr = new InputStreamReader(is,"UTF-8");
  23. int len = 0;
  24. char[] buf = new char[1024];
  25. while ((len = isr.read(buf)) != -1)
  26. {
  27. sb.append(new String(buf, 0, len));
  28. }
  29. is.close();
  30. isr.close();
  31. } else
  32. {
  33. throw new CommonException("访问网络失败!");
  34. }
  35. } catch (Exception e)
  36. {
  37. throw new CommonException("访问网络失败!");
  38. }
  39. return sb.toString();
  40. }
  41. </span>

问题解决。

Android 从网络中获取数据时 产生部分数据乱码的解决的更多相关文章

  1. Android从网络中获取xml文件并解析数据

    public class XmlwebData { @SuppressLint("UseValueOf") public static List<Person> get ...

  2. Android中获取网页表单中的数据实现思路及代码

    在Android中获取网页里表单中的数据具体实现代码如下,感兴趣的各位可以参考过下哈,希望对大家有所帮助 MainActivity如下: 复制代码 代码如下: package cn.testjavas ...

  3. Android中获取网页表单中的数据

    MainActivity如下: package cn.testjavascript; import java.util.StringTokenizer; import android.os.Bundl ...

  4. Sql 中获取年月日时分秒的函数

    getdate():获取系统当前时间 dateadd(datepart,number,date):计算在一个时间的基础上增加一个时间后的新时间值,比如:dateadd(yy,30,getdate()) ...

  5. 从网络中获取图片显示到Image控件并保存到磁盘

    一.从网络中获取图片信息: /// <summary> /// 获取图片 /// </summary> /// <param name="url"&g ...

  6. koa 基础(十)原生node.js 在 koa 中获取表单提交的数据

    1.app.js // 引入模块 const Koa = require('koa'); const router = require('koa-router')(); /*引入是实例化路由 推荐*/ ...

  7. 在Express 中获取表单请求体数据

    在Express 中获取表单请求体数据 获取 GET 请求参数 获取 POST 请求体数据 安装 配置 获取 GET 请求参数 Express 内置了一个 API , 可以直接通过 req.query ...

  8. python 使用xlsxwriter 写入数据时,当数据中链接的后面包含空格时(如:"http://*** "),导出问题打开报错

    python 在使用 xlsxwriter组件写入数据时,当数据包含类似“http://*** /”数据时,导出的excel,打开时会提示如下错误: 没有查到相关的资料处理这个问题,可能原因为exce ...

  9. 爬虫爬数据时,post数据乱码解决办法

    最近在写一个爬虫,目标网站是:http://zx.bjmemc.com.cn/,可能是为了防止被爬取数据,它给自身数据加了密.用谷歌自带的抓包工具也不能捕获到数据.于是下了Fiddler.     F ...

随机推荐

  1. Oracle 数据库基础学习 (八) PL/SQL综合练习

    1.定义游标:列出每个员工的姓名.部门名称并编程显示第10个到第20个记录. declare cursor zemp_cursor is (select temp.ename, temp.dname ...

  2. jq样式方法总结

    .html()方法 获取集合中第一个匹配元素的HTML内容 或 设置每一个匹配元素的html内容,具体有3种用法: .html() 不传入值,就是获取集合中第一个匹配元素的HTML内容 .html( ...

  3. 利用Civil 3D API更改曲面的样式

    如果你需要更改曲面的样式,比如更改等高线的颜色等等,在Civil 3D中,你可以通过在toolspace中选中曲面,然后点右键选择“Edit surface style…”然后切换到“Display” ...

  4. yum使用点滴

    yum下载依赖rpm包 先安装一个yum-downloadonly 1 yum install yum-downloadonly完成安装后,yum –help在最后就提示两个命令参数,分别是: Plu ...

  5. iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)

    在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...

  6. [转]Android App整体架构设计的思考

    1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...

  7. Github+hexo绑定域名

    Github绑定域名 近期在新网购买了一个属于自己的域名,因此想着把自己用hexo+github搭建的博客通过域名访问,但是找了n长时间来搞,都没有成功.心灰意冷之中再次通过google来搜索,终于有 ...

  8. iOS---用Application Loader 上传的时候报错No suitable application records were found. Verify your bundle identifier 'xx' is correct

    用Application Loader 上传的时候报错,突然发现用Application Loader的账号 竟然不是公司的账号  换成公司的账号 就可以了.

  9. android:使用RemoteView自定义Notification

    //网上相关内容较少,遂记录下来,备忘. //依然以音乐播放器demo为例. 效果截图 //锤子手机上的效果 step1 准备自定义layout 常规的实现方式,并不会因为是用于notificatio ...

  10. Linux挂载卸载光盘&实践

    在Linux下有时候需要挂载光盘,拷贝文件或安装系统,例如拷贝Redhat操作系统镜像文件等.下面介绍一下在Linux系统下挂载.卸载光盘的方法. 在Linux系统中,每一个物理设备都可以看做是一个文 ...