Android 가 네트워크 에서 데 이 터 를 가 져 올 때 일부 데이터 난 장 판 해결

전재 출처:http://blog.csdn.net/lmj623565791/article/details/23562939
문제 설명: 네트워크 에서 html 페이지 를 캡 처 하여 분석 한 결과 일부 중국어 오류 가 발생 한 것 을 발견 하 였 습 니 다.
유래: csdn 클 라 이언 트 를 만 들 때 발생, http://blog.csdn.net/lmj623565791/article/details/23532797  (자바 환경 에서 콘 솔 을 사용 하여 인쇄 하 는 것 은 어 지 러 운 코드 가 없습니다)
Android 从网络中获取数据时 产生部分数据乱码的解决_第1张图片
서버 에서 읽 은 코드 를 즉시 검사 합 니 다:
	/**
	 *         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 바이트, 중국어 2 바이트) 이기 때문에 1024 는 특정한 한자 의 절반 (이전 바이트) 을 잘 랐 을 수도 있 습 니 다.그리고 문자열 로 바 뀌 었 을 때 오류 가 발생 합 니 다.유일 하 게 이해 하지 못 하 는 것 은 자바 환경 에서 콘 솔 로 인쇄 하 는 것 은 어 지 러 운 코드 가 없습니다.다른 이해 가 있다 면 댓 글 검토 환영 합 니 다.
따라서 데 이 터 를 읽 는 코드 를 바이트 흐름 에서 문자 흐름 으로 바 꾸 고 수 정 된 코드 는 다음 과 같 습 니 다.
	/**
	 *         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();
	}

문제 해결.

좋은 웹페이지 즐겨찾기