java的IO流包装不当导致从网页获取的数据出现乱码
从网页上获取数据时必须要注意字符集的问题。处理不慎确实苦不堪言。
例如通过URL连接时,将字节流InputStream包装成字符流(以便直接存为String)时,一定要注意加上charsetName这一参数。源码为
InputStreamReader(InputStream in, String charsetName) //创建使用指定字符集的 InputStreamReader。
此时将该参数设为相应网页使用的字符集即可。(一般为UTF-8或GBK等)
举个例子。
[java][/java] view plaincopyprint?
- 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,而原网页字符集为UTF-8这样的不定长编码(英文一字节中文三字节),编码为char再存为String的过程中一些特殊字符无法正确转换(具体机制暂时不明,今晚纠结到现在先打住了)。
举个错误例子。
[java][/java] view plaincopyprint?
- 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,此时部分数据无法正确转换