Java抓取网页乱码问题解决

一、乱码产生的原因:
由于在网络上传输的数据是基于字节流,在 java 中对应的就是byte。然而不同的编码对同样的字节会进行不同的组织,形成不同的形式展现在我们眼前。就比如:拿记事本记录“我爱你”这三个中文字符,在计算机中是不认识这种东西的,它只认识0和1,然而你用记事本编辑的时候,当你输入这三个字的时候,其实记事本
已经按照默认的编码帮你转化成了0和1。当你写网页的时候,网页编辑器就会去读取你设置的网页编码,否则就按照默认编码把你写好的网页转化成0和1的组合。
这个时候,如果你用 java 代码去获取这个页面,对方的计算机就会把这些0和1的组合发到网络上传输,传输过来之后,如果你不按照它原来的编码格式进行转化过来给人看,人就会看到乱码,除非运气好,刚好你用的编码与他原来的编码兼容。
在java中如果需要将字节0和1的组合给人看,就要把字节转化成字符串,这个时候你如果没有指定编码格式,java就自作主张,按照他的默认格式unicode编码,把字节组织成字符串,然后unicode编码你也懂啦,基本上和中文字符等编码是不兼容的,于是就会乱码的离谱,如果你决定在转化成字符串之前,显示的指定编码,那么恭喜你,你已经要疯了。原因是什么,是因为你在网上拿到的网页你怎么知道是什么编码呢?幸运的是,英文字符大部分编码都是兼容的。所以你可以按照任意编码先将读到的东西转化成字符串,然后判断它的字符编码,然后再按照它正确的编码重新全部转化。但是你发现没有,这样是不是很麻烦啊!有没有简单的办法呢?
呵呵,恭喜你,有的!方法就是,不进行字符转码,我直接把字节流往文本里面写,你想想会发生什么呢?

注意: 在实际开发中出现的 乱码 问题实际上都是在字符流和字节流之间转化不统一而造成的

package chapter2;

import java.io.*;
import java.net.*;
import java.nio.CharBuffer;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class WebCrawler { 

private static String Text_File_Path = "E:\\workshop\\ch2\\htmlsrc.html";

 public static void main(String[] args) throws IOException {
        try { 
        //生成写文件对象 (写文件者需要某个文件对象)
       
        File file = new File(Text_File_Path);
        
        if(!file.exists()) {
        File fileDir = file.getParentFile();
        if(!fileDir.isDirectory()) {
        fileDir.mkdirs();
        }
       
        file.createNewFile();
       
        }
       
FileWriter fpWriter = new FileWriter(file);//需要最后关闭
       
            // 生成下载对象
//连接某台主机的某个端口
            Socket webclient = new Socket("www.bnu.edu.cn", 80); 
            //生成写对象 写到台主机的某个端口
            PrintWriter result = new PrintWriter(webclient.getOutputStream(), true); 
            //生成bufferredreader对象 需要inputstreamreader,需要inputstream
            BufferedReader receiver = new BufferedReader(new InputStreamReader(webclient.getInputStream()));
            InputStream webInput = webclient.getInputStream();

           //发送HTTP request请求
           result.println("GET / HTTP/1.1"); 
           result.println("Host: bnu.edu.cn"); 
           result.println("Connection: Close"); 
           result.println();
           
           //接收HTTP Response 返回的结果信息        
           boolean bRet = true;
           StringBuilder sBuilder = new StringBuilder(); 
           while (bRet) { 
              if (receiver.ready()) {
            byte[] bytes = new byte[1024];
                int count = 0;
                while (count != -1) {
               
                count = webInput.read(bytes);
           
                String tempStr = new String(bytes,"utf-8");
                System.out.println(tempStr);
                sBuilder.append(tempStr);
                }
                bRet = false; 
           
          }
           
          // 显示获得的网页正文,打印到控制台  
          //System.out.println(new String(sBuffer.toString().getBytes("gbk"),"utf-8"));
          //System.out.println(sBuilder.toString());
          fpWriter.write(sBuilder.toString());
          webclient.close();
          fpWriter.close();
       } catch (UnknownHostException e) {
            System.err.println("无法访问指定主机."); 
            System.exit(1);
       } catch (IOException e) { 
           System.err.println("下载失败,请检查输入地址是否正确。");  
           System.exit(1);
       
        
  }
        
 
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JEEBBS最新版本采用hibernate3+spring mvc+spring3+freemarker技术架构,重新设计了jeebbs,重新架构后的JEEBBS性能得到了很大的提升,功能相比jeebbs v1.0也丰富了许多。 jeebbsV4.0功能列表 1、论坛APP 2、登录更改shiro登录认证以及记住我 3、在线人数、时长统计 4、提供用户接口、其他系统用户接口调用设置以及接口管理(可与jeecms系列软件无缝对接实现单点登录) 5、用户自定义字段 6、禁用ip、id发帖、回帖 7、注册成功自动登录 8、设置在线活跃度等级 9、手机模板方案设置 10、最近登录过(三天,一周、一个月、三个月、半年)查询 11、类似微信团队号(与用户沟通账户以及推送系统消息) 12、QQ登录 jeebbsV4.0修复以及完善部分 1.权限的访问的地址链接 2.图片太大显示不全问题 3.会员组设置附件上线没有用以及其他相关设置无效 4.附件上传经常上传不了 5.发帖文字内容不能居中、居左、居右 编辑器字体、大小、插入图片、排序列表无效、左浮动、右浮动 6.用户自定义头像错误 7.注册如果发送邮件激活的方式出错(返回页面错误org.hibernate.LazyInitializationException: could not initialize proxy - no Session) 8.禁止用户后不允许登录、发帖、回帖等 9.后台会员搜索中文名搜索码 10.注册会员的时候提示邮箱的格式不对 11.登录设置邮箱密码文本框改成密码框

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值