java的IO流包装不当导致从网页获取的数据出现乱码
从网页上获取数据时必须要注意字符集的问题。处理不慎确实苦不堪言。
例如通过URL连接时,将字节流InputStream包装成字符流(以便直接存为String)时,一定要注意加上charsetName这一参数。函数原型为
InputStreamReader(InputStream in, String charsetName) //创建使用指定字符集的 InputStreamReader。
此时将该参数设为相应网页使用的字符集即可。(一般为UTF-8或GBK等)
举个例子。
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(80000);
conn.setRequestMethod("GET");
conn.connect();
//将输入流转换为字符流
BufferedReader bufReader = new BufferedReader(
new InputStreamReader(
conn.getInputStream()
,"UTF-8"
)
);
//假定数据仅有一行
String result=bufReader.readLine();
但如果在包装字符流的时候没有设置字符集,而试图先获取原始数据之后再转换的话仍是有问题的。原因我认为是字节流获取的数据在转为字符流中的数据时,即涉及到将byte编码为char,在使用默认GBK编码时,UTF8字节流中某些字节不能正确解码,被转换成GBK的乱码表示了,也就是InputStreamReader内部的字节数组(如果有的话),也和HttpURL返回的已经不一致了。
举个错误例子。
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(80000);
conn.setRequestMethod("GET");
conn.connect();
//将输入流转换为字符流
BufferedReader bufReader = new BufferedReader(
new InputStreamReader(
conn.getInputStream()
//,"UTF-8"无此参数将发生错误
)
);
//假定数据仅有一行
String result=bufReader.readLine();
String newResult=new String(result.getBytes("GBK"),"UTF-8");
//试图将网页中的UTF-8数据转换为GBK,此时部分数据无法正确转换
java的IO流包装不当导致从网页获取的数据出现乱码的更多相关文章
- JAVA中IO流总结
		
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...
 - Java基础——IO流
		
今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...
 - java之IO流详解(一)
		
IO流的分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 InputStream 字节输出流 OutputStream 字符流 字符输入流 Reader 字 ...
 - 第15章-输入/输出 --- 理解Java的IO流
		
(一)理解Java的IO流 JAVA的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出(键盘.文件.网络连接等)抽象表述为"流"( ...
 - Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
		
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
 - Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)
		
Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...
 - Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter)
		
Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.转换流概述 我们之前 ...
 - Java 的 IO 流
		
接着上一篇的 “Java 的 File 类” 的随笔,在File类的基础上,我们就走进Java的IO流吧. 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在 ...
 - Java进阶 | IO流核心模块与基本原理
		
一.IO流与系统 IO技术在JDK中算是极其复杂的模块,其复杂的一个关键原因就是IO操作和系统内核的关联性,另外网络编程,文件管理都依赖IO技术,而且都是编程的难点,想要整体理解IO流,先从Linux ...
 
随机推荐
- java学习之匿名内部类与包装类
			
匿名内部类: 所谓匿名内部类,顾名思义指的就是定义在类内部的匿名类,现有的spring框架开发以及java图形界面都经常用到匿名内部类. 下面来看一个代码: interface A{ public v ...
 - js中的刷新方法
			
刷新并清除缓存: location.reload(true); 返回上一页并刷新: history.go(-1); location.reload(true); 子页面刷新父页面: self.open ...
 - find the mincost route(最小环,最短路,floyd)
			
find the mincost route Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
 - Android开发实例之闹钟提醒
			
本实例通过TimePickerDialog时间选择对话框让用户设置闹钟.并通过AlarmManager全局定时器在指定的时间启动闹钟Activity . 程序执行效果图: 实例代码: package ...
 - eclipse使用技巧---使用正则表达式查找替换
			
1,Eclipse ctrl+f 打开查找框2,选中 Regular expressions (正则表达式) 去掉/* */(eclipse) /\*(.|[\r\n])*?\*/去掉/ ...
 - PHP GUID的生成源码
			
<?php function guid(){ if (function_exists('com_create_guid')){ return com_create_guid(); }else{ ...
 - BZOJ 4321: queue2( dp )
			
dp(i, j, 1)表示前i个, 有j对是不合法的, i和i-1是在一起的. dp(i, j, 0)表示前i个, 有j对是不合法的, i和i-1不在一起的. 转移我们只需考虑是多了一对不合法的还是少 ...
 - BZOJ 2946: [Poi2000]公共串( 后缀自动机 )
			
一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...
 - Hive常用操作之数据导入导出
			
一.Hive数据导入导出 1.hive数据导出 很多时候,我们在hive中执行select语句,希望将最终的结果保存到本地文件或者保存到hdfs系统中或者保存到一个新的表中,hive提供了方便的关键词 ...
 - Aliyun EMR 集群重启
			
1.如果Core节点有Down掉,ActiveNodes少于Core节点数. 处理: a.登陆到Master节点,到目录 /opt/apps/hadoop-2.7.2/sbin b.执行 ./stop ...