java的IO流包装不当导致从网页获取的数据出现乱码

从网页上获取数据时必须要注意字符集的问题。处理不慎确实苦不堪言。

例如通过URL连接时,将字节流InputStream包装成字符流(以便直接存为String)时,一定要注意加上charsetName这一参数。源码为

InputStreamReader(InputStream in, String charsetName)  //创建使用指定字符集的 InputStreamReader。

此时将该参数设为相应网页使用的字符集即可。(一般为UTF-8或GBK等)

举个例子。

 

[java][/java] view plaincopyprint?

  1. URL url = new URL(urlString);
  2. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
  3. conn.setConnectTimeout(80000);
  4. conn.setRequestMethod(“GET”);
  5. conn.connect();
  6. //将输入流转换为字符流
  7. BufferedReader bufReader = new BufferedReader(
  8.         new InputStreamReader(
  9.                 conn.getInputStream()
  10.                 ,”UTF-8″
  11.                 )
  12.         );
  13. //假定数据仅有一行
  14. String result=bufReader.readLine();

但如果在包装字符流的时候没有设置字符集,而试图先获取原始数据之后再转换的话仍是有问题的。原因我认为是字节流获取的数据在转为字符流中的数据时,即涉及到将byte编码为char,而原网页字符集为UTF-8这样的不定长编码(英文一字节中文三字节),编码为char再存为String的过程中一些特殊字符无法正确转换(具体机制暂时不明,今晚纠结到现在先打住了)。

 

举个错误例子。

 

[java][/java] view plaincopyprint?

  1. URL url = new URL(urlString);
  2. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
  3. conn.setConnectTimeout(80000);
  4. conn.setRequestMethod(“GET”);
  5. conn.connect();
  6. //将输入流转换为字符流
  7. BufferedReader bufReader = new BufferedReader(
  8.         new InputStreamReader(
  9.                 conn.getInputStream()
  10.                 //,”UTF-8″无此参数将发生错误
  11.                 )
  12.         );
  13. //假定数据仅有一行
  14. String result=bufReader.readLine();
  15. String newResult=new String(result.getBytes(“GBK”),”UTF-8″);
  16.     //试图将网页中的UTF-8数据转换为GBK,此时部分数据无法正确转换

标签