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

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();
	}
问题解决。





分享到:
评论

相关推荐

    Android读取中文文件乱码解决方法

    如果处理不当,可能会遇到中文乱码的问题,尤其是在读取本地文件或者从网络下载文件时更为常见。本文将详细介绍如何解决Android平台上的中文乱码问题,并提供一个具体的示例代码。 #### 二、中文乱码的原因分析 ...

    串口通信解决数据乱码和数据丢失

    总的来说,解决串口通信中的数据乱码和数据丢失,关键在于理解串口通信的基本原理,正确配置通信参数,以及在软件设计中充分考虑各种可能的异常情况。希望本文能对初学者在理解和解决这些问题上提供帮助。

    拦截器解决中文乱码问题

    在开发Web应用时,中文乱码是一个常见的问题,尤其是在数据的传输过程中。"拦截器解决中文乱码问题"这个主题,主要关注的是如何通过使用拦截器(Interceptor)这一技术手段来预防或解决乱码现象。拦截器是Spring MVC...

    java android zip解压缩(解决压缩中文乱码问题)

    在Android开发中,处理压缩文件是一项常见的任务,尤其是在下载、更新或者备份数据时。然而,当压缩文件包含中文字符时,解压缩过程中可能会遇到乱码问题。这是因为编码格式不匹配或者处理方式不当导致的。本篇文章...

    android扫描二维码中文乱码

    总之,解决"android扫描二维码中文乱码"的问题需要深入理解编码原理,以及如何在ZXing库中实现对GBK编码的支持。通过修改源代码或在应用层面进行处理,我们可以确保中文字符在扫描二维码时能被正确显示。

    android二维码开发 ZXing(中文乱码已处理)

    本项目针对ZXing进行了优化,特别是解决了中文乱码的问题,使得开发者在处理包含中文字符的二维码时能够更加顺利。以下是关于ZXing二维码开发以及解决中文乱码问题的详细知识点: 1. **ZXing框架概述**: ZXing是...

    sqlite数据库存取中文乱码的全部解决方案

    sqlite数据库存取中文乱码的全部解决方案(包括其它数据库oracle+sqlserver+mysql) 数据库的连接方式、数据库里存放数据的字体编码、所选编程语言的缺省字体编码。如果在编程中遇到不能正确显示中文时、、、、

    android解决乱码

    在Android开发过程中,乱码问题是一个常见的挑战,尤其是在处理文本数据或者从网络获取资源时。本文将深入探讨如何解决Android中的乱码问题,并提供相关的工具和技术来帮助开发者更有效地处理编码问题。 首先,我们...

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

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

    解决cocos2d中文乱码的项目

    - 如果数据是从网络或其他来源获取,可能需要进行编码转换。使用C++的`std::wstring_convert`或第三方库如`iconv`来实现编码转换。 5. **平台差异**: - Windows和Android平台可能存在差异。在Android上,可能...

    使用Volley来写一个List列表(解决中文乱码问题)

    Volley是Google推出的一款高效的网络请求库,特别适合Android应用中的数据加载。它以其轻量级、快速响应和良好的性能而受到开发者的欢迎。在处理包含中文内容的网络请求时,可能会遇到乱码问题,这通常是因为编码...

    volley 获取json数据

    在本主题中,我们将深入探讨如何使用 Volley 获取 JSON 数据,特别是在处理中文乱码问题以及解析 JSON 对象来获取天气信息。 首先,Volley 的核心优势在于其缓存机制和线程管理。通过内部的请求队列,Volley 可以...

    Android获取网页源码

    在Android开发中,获取网页源码是一项常见的任务,它能够帮助开发者分析网页内容、抓取数据或者实现自动化操作。本文将详细介绍如何在Android环境中通过异步处理来获取任意网页的HTML源码。 首先,我们需要引入必要...

    Android流方式发送XML数据

    在Android应用开发过程中,数据传输是不可或缺的一环,尤其在与服务器交互时,如何高效、稳定地发送大量数据变得尤为重要。本文将深入探讨一种适用于大数据量传输的方法——流方式发送XML数据。这种方法不仅能够处理...

    Android例子源码可以通过网络请求内容的自定义列表选择Dialog.zip

    这个例子中,对话框会在显示后立即发起网络请求,以动态获取数据。Android中常用的网络库有`HttpURLConnection`、`Volley`、`OkHttp`以及`Retrofit`等。考虑到描述中提到的编码GBK和API版本2.3.3,很可能使用的是较...

    Android例子源码获取设备上的所有传感器信息并显示

    要获取`SensorManager`,我们需要通过以下代码从系统服务中获取: ```java SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); ``` 这里,`getSystemService()`是一个...

    Android读取网页源代码解决编码错误问题

    在Android开发中,获取网页源代码是常见的需求,例如用于数据抓取或解析网页内容。在本教程中,我们将深入探讨如何在Android应用中正确地以GET方式读取网页源代码,并解决可能出现的编码错误导致的乱码问题。 首先...

    FR1128-Android仪表盘网速测试源码_测速_仪表盘_android_

    在压缩包的文件名列表中,"FR1128-Android仪表盘网速测试源码"可能是项目的主要源代码文件,而"FR1128-Android╥╟▒φ┼╠═°╦┘▓Γ╩╘╘┤┬δ"这部分看起来像是乱码,可能是由于字符编码问题导致的显示错误,...

    读取zip文件,不解压缩直接解析,支持文件名中文,解决内容乱码(还是以支付宝对账单为例)

    为了解决乱码问题,我们需要确保在读取文件内容时使用正确的字符编码。在Python中,这可以通过指定`decode()`函数的编码参数来实现,如`content = content.decode('utf-8')`。在Java中,可以使用`new String(data, ...

Global site tag (gtag.js) - Google Analytics