zoukankan      html  css  js  c++  java
  • java网络流传输,中文乱码问题。

    最近需要从某个网页上抓取数据。一波三折。

    1. 先要找到网站页面调用后台数据服务的url地址,但是本人对js不了解,花了不少时间在分析其网页源代码的js部分,试图寻找出调用数据的链接。

    后来得知浏览器都会追踪页面发出去的所有链接,chrome中,“F12->网络” 会显示所有的调用链接。读取后端数据的链接就在里面。

    2. 找到url链接之后,接下来读取数据。

     开始时用的是HttpGet类来读取,代码如下:

    HttpGet httpGet = new HttpGet(url);
    CloseableHttpResponse response = null;
    try {
           response = httpClient.execute(httpGet);
           HttpEntity entity = response.getEntity();
           body = EntityUtils.toString(entity);
    } catch (IOException e) {
           e.printStackTrace();
    }
    return body

    但是在body中,总是会有乱码的出现,如在页面上显示的“”在程序中显示为乱码。在页面上请求头和响应头的内容,发现返回的字符集是“gb2312”,于是把代码改为

    body = EntityUtils.toString(entity,“gb2312”);

    但是仍然显示为乱码。

    于是在网上(http://www.qqxiuzi.cn/bianma/zifuji.php)查询“凱”等乱码的字符集,发现“GBK”包含这些,而“GB2312”并不包含这些比较少见的字。看来是网页上的字符集信息不太对。

    接着把代码修改为

    body = EntityUtils.toString(entity,“gbk”);

    还是有问题。。。

    接着尝试在http头中加入“charset=gbk”,没有变化,服务端不支持。。。

    3. 改为从网页读取字节流数据

    上一步改完代码后仍然有问题,猜测是EntityUtils内部已经做好了转换。但是不知道怎么更进一步,所以打算从源头开始,接收字节流数据。

    代码如下:

    URL quest = new URL(url);
    HttpURLConnection Connection = (HttpURLConnection).quest.openConnection();
    InputStream is = Connection.getInputStream();
    int len = 0;
    byte[] temp = new byte[102400]; 
    int llen = -1;
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    while ((llen = is.read(temp, 0, 102400)) != -1) {
        outStream.write(temp, 0, llen);
    }
    is.close();
    content = new String(outStream.toByteArray(),"gbk");

    ByteArrayOutputStream接收byte数据,是为了防止中间被截断导致最后翻译目标字符集的时候出现错误。

    这么使用的前提是要知道数据的字符集编码。

    从结果往回看是一个简单的方法,但是之中的每一步都花费了不少精力才找到正确的方向,debug是个苦力活~~~

    综上,看来最有效的方法是接收字节流,自己转成相应字符集编码格式。

  • 相关阅读:
    Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”: No such file or directory”
    C、Shell、Perl基于Tomcat开发CGI程序环境配置
    Windows机器配置启动加载器的高级选项后,机器出现蓝屏,无法RDP
    Linux由于物理节点故障导致的异常重启-Case1
    Azure经典虚拟机(Windows)如何监测单个磁盘的使用空间
    ARM VM安装Linux Diagnostic 2.3扩展
    rsyslog服务日志报错分析1
    登陆Linux服务器时触发邮件提醒
    部署Azure Log Analytics
    获取指定订阅下所有Azure ARM虚拟机配置(CPU核数,内存大小,磁盘信息)的使用情况
  • 原文地址:https://www.cnblogs.com/starRebel/p/5630872.html
Copyright © 2011-2022 走看看