java 读取网页乱码的问题

blare 发布于 2011/09/23 14:27
阅读 2K+
收藏 0

要读取网页www.bnu.edu.cn的内容,用以下两种方式读取,第一种显示正常,第二种却总是乱码。请问第二种的读取问题出在了哪里?

方法一:

            String url = "http://www.bnu.edu.cn";//www.bnu.edu.cn";
            URL theUrl= new URL(url);
            openStream = theUrl.openStream();
            //<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            //构建输入流的的字符集必须和HTML源码中的 charset一致
            bf = new BufferedReader(new InputStreamReader(openStream,"utf-8"));
            String line = null;
            while((line = bf.readLine())!=null) {
                System.out.println(line);
            }

方法二:

Socket webClient = new Socket ("www.bnu.edu.cn", 80);
PrintWriter result = new PrintWriter(webClient.getOutputStream(), true);
BufferedReader receiver = new BufferedReader (new InputStreamReader(webClient.getInputStream()));

result.println("GET / HTTP/1.1");
result.println("Host: bnu.edu.cn");
result.println("Connection: Close");
result.println();

boolean bRet = true;
StringBuffer sb = new StringBuffer (8096);
while (bRet) {
if (receiver.ready()) {
    int idx = 0;
    while (idx!=-1) {
	idx = receiver.read();
	sb.append((char)idx);
    }
    bRet = false;
}
}
byte [] b = (sb.toString()).getBytes("UTF-8");//"GBK", "ISO-88591-1";
String str = new String(b,"GB2312");
System.out.println(str);
webClient.close();
加载中
0
君无畏
君无畏

sb.toString() 应该已经 默认转了一次码了吧 

如果不是Linux 系统 ,这里就应该已经乱码了 然后在 .getBytes("UTF-8")

然后 在gb2312 转回来 ,还转得回来吗?? 

0
君无畏
君无畏

好像 浏览器是先在 http头里找 Content-Type 里是否有编码设置, 有的话就按 Content-Type 里编码对

HTML 进行解码 ,没有 则根据<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 这个解码.所以 有时看到有的网站响应的 编码 和 html内容里的编码不一致时,浏览器也能正确识别( 汗,,,不知道咋想的)

最后才是根据 网页内容自动识别吧...

不知道这个优先级对不对??

0
浪客Dandy
浪客Dandy
请用Apache Http Client
0
找寻
找寻

Socket webClient = new Socket ("www.bnu.edu.cn", 80);
  PrintWriter result = new PrintWriter(webClient.getOutputStream(), true);
  BufferedReader receiver = new BufferedReader (new InputStreamReader(webClient.getInputStream(),"utf-8"));

  result.println("GET / HTTP/1.1");
  result.println("Host: bnu.edu.cn");
  result.println("Connection: Close");
  result.println();

  boolean bRet = true;
  StringBuffer sb = new StringBuffer (8096);
  while (bRet) {
  if (receiver.ready()) {
      int idx = 0;
      while (idx!=-1) {
   idx = receiver.read();
   sb.append((char)idx);
      }
      bRet = false;
  }
  }
  //byte [] b = (sb.toString()).getBytes("UTF-8");//"GBK", "ISO-88591-1";
  //String str = new String(b,"GB2312");
  //String str = new String(b);
  System.out.println(sb.toString());
  webClient.close();

0
找寻
找寻

在获取字符解码的时候使用UTF-8,它本身是UTF-8的字符,所以不必要在进行转码。直接打印出来就行了

0
b
blare
真接打印出来的话就是乱码,不然的话,也不会想办法转码了。。。
0
b
blare

问题的原因找到了, 之前直接打印之所以是乱码, 原因在于用的Eclipse在Windows上默认Encoding=GBK, 把默认Encoding改成UTF-8之后, 就如楼上的兄弟们所说, 可以直接打印出正常的字符串了. 非常感谢大家的指引.

 

返回顶部
顶部