开发者社区 问答 正文

java 读取网页乱码的问题:报错

要读取网页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();

展开
收起
kun坤 2020-06-07 14:14:42 735 分享 版权
1 条回答
写回答
取消 提交回答
  • sb.toString() 应该已经 默认转了一次码了吧 

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

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

    ######

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

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

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

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

    ######请用Apache Http Client
    ######

    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();

    ######

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

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

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

     

    2020-06-07 14:14:47
    赞同 展开评论