`
jgsj
  • 浏览: 967182 次
文章分类
社区版块
存档分类
最新评论

Android 从网络中获取数据时 产生部分数据乱码的解决

 
阅读更多

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

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

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


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

	/**
	 * 返回该链接地址的html数据
	 * 
	 * @param urlStr
	 * @return
	 * @throws CommonException
	 */
	public static String doGet(String urlStr) throws CommonException
	{
		StringBuffer sb = new StringBuffer();
		try
		{
			URL url = new URL(urlStr);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(5000);
			conn.setDoInput(true);
			conn.setDoOutput(true);

			if (conn.getResponseCode() == 200)
			{
				InputStream is = conn.getInputStream();
				int len = 0;
				byte[] buf = new byte[1024];

				while ((len = is.read(buf)) != -1)
				{
					sb.append(new String(buf, 0, len, "UTF-8"));
				}

				is.close();
			} else
			{
				throw new CommonException("访问网络失败!");
			}

		} catch (Exception e)
		{
			throw new CommonException("访问网络失败!");
		}
		return sb.toString();
	}

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

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

	/**
	 * 返回该链接地址的html数据
	 * 
	 * @param urlStr
	 * @return
	 * @throws CommonException
	 */
	public static String doGet(String urlStr) throws CommonException
	{
		StringBuffer sb = new StringBuffer();
		try
		{
			URL url = new URL(urlStr);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(5000);
			conn.setDoInput(true);
			conn.setDoOutput(true);

			if (conn.getResponseCode() == 200)
			{
				InputStream is = conn.getInputStream();
				InputStreamReader isr = new InputStreamReader(is,"UTF-8");
				int len = 0;
				char[] buf = new char[1024];

				while ((len = isr.read(buf)) != -1)
				{
					sb.append(new String(buf, 0, len));
				}

				is.close();
				isr.close();
			} else
			{
				throw new CommonException("访问网络失败!");
			}

		} catch (Exception e)
		{
			throw new CommonException("访问网络失败!");
		}
		return sb.toString();
	}
问题解决。





分享到:
评论

相关推荐

    拦截器解决中文乱码问题

    利用拦截器解决中文乱码。配置Web文件,用到的文件都上传了

    Android设备获取扫码枪扫描的内容与可能遇到的问题解决

    那么android设备如何通过蓝牙获取扫描内容的呢? 1. 蓝牙配对,连接设备 打开系统设置,找到蓝牙,打开扫码枪,配对扫码枪设备。输入一个固定的配对码,一般扫码枪说明书里都有写。配对完成后,显示设备已连接。就ok...

    volley 获取json数据

    volley使用演示,解决中文乱码问题。 获取json格式天气信息,使用JSONObject解析数据

    不同APP之间数据访问AIDL跨进程访问

    一个简单的跨进程AIDL访问,包含简单的被调用程序和调用AIDL的程序,方便初学者学习AIDL跨进程,跨APP数据访问。 客户端和原程序跟目录下都包含了read.txt阅读文档,方便学者学会AIDL的调用 【程序基于UFT-8格式,...

    AES用户名(中文)、密码加密解密

    web端提交前给中文 密码加密,后台解密后与 表中数据比较。防止抓包获取用户信息。

    volley+百度地图=天气

    网络访问使用了volley,本地位置定位使用百度地图api,天气数据的获取是从新浪获取,并成功解决了汉字乱码问题

    ApkTool,安卓逆向工具

    解包时 , 必须使用 ApkTool 解包工具 , 将二进制数据格式的 xml 文件转为 文本 xml 文件 , 才能获取刻度的 xml 文件 ; 打包 : 将使用 ApkTool 工具解包后的零散文件 , 再次打包成 APK 文件 , 如果 APK 文件进行了...

    74cms 骑士人才系统 v4.1.23 正式版 人才招聘系统源码

    凭借骑士网络的不断创新精神和认真的工作态度,骑士人才系统已成国内同类软件中的最好用的人才系统。 骑士cms人才系统 v4.1.23 bulid2017.02.17 更新内容: 修复 后台测试邮件发送失败提示问题 修复 后台‘邮件...

    Git权威指南PDF完整版

    11.4.7 获取历史版本/ 156 第12章 改变历史/ 157 12.1 悔棋/ 157 12.2 多步悔棋/ 159 12.3 回到未来/ 161 12.3.1 时间旅行一/ 162 12.3.2 时间旅行二/ 167 12.3.3 时间旅行三/ 171 12.4 丢弃历史/ 174 12.5 反转提交...

Global site tag (gtag.js) - Google Analytics