苏飞论坛广告位

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V1.3) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程 - 订阅更新

HttpHelper万能框架(V2.1) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V1.9) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 185|回复: 14

[其他] 【已解决】编码问题求教

[复制链接]

该用户从未签到

发表于 2017-12-3 17:20:59 | 显示全部楼层 |阅读模式
哪位对编码熟悉的请帮我看下,我提交一个http post(https://subway.simba.taobao.com/bidword/add.htm),相关formdata为“word=dd%e8%8a%b1”,包含一个汉字“花”,也就是“word=dd花”,先把“花”用utf8编码为%e8%8a%b1,再将post数据变成用utf-8编码的bytes,但是网页后面的返回结果却是变成了“%C3%A8%C2%8A%C2%B1”,也就是“花”,明显是个乱码,感觉这一串是把%e变成了%C3%A,把%8变成了%C2%8,把%b变成了%C2%B
我抓包的也是提交的同样的一模一样的formdata  “word=dd%e8%8a%b1”,我用同样的一模一样的提交就是乱码,请问这是怎么回事啊?有谁能看懂返回的这种%C2%8是不是又通过了其它编码转码了呢?对其他网页post的汉字用utf-8的也提交了很多次,从来没碰到过这种情况


  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 403 天

    [LV.9]以坛为家II

    发表于 2017-12-4 09:05:30 | 显示全部楼层

    该用户从未签到

     楼主| 发表于 2017-12-4 10:13:49 | 显示全部楼层
    站长苏飞 发表于 2017-12-4 09:05
    看你的逻辑是重复编码,编码只需要一次即可。

    我也有怀疑过是不是重复编码,所以我用word=dd花直接去post也试过了,还是一样的结果,变成了花
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 403 天

    [LV.9]以坛为家II

    发表于 2017-12-4 10:57:45 | 显示全部楼层

    该用户从未签到

     楼主| 发表于 2017-12-4 11:14:51 | 显示全部楼层
    本帖最后由 2949497060 于 2017-12-4 11:33 编辑
    站长苏飞 发表于 2017-12-4 09:05
    看你的逻辑是重复编码,编码只需要一次即可。

    我把我的代码直接贴出来,飞哥帮我运行一下试试吧,除了cookie和post里的token参数可能失效外,其它应该都可以直接运行,cookie或者token要是失效了我就重新发:
    string url = "https://subway.simba.taobao.com/bidword/add.htm";
                string userAgent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1";
                string referer = "https://subway.simba.taobao.com/";
                string cookies = "UM_distinctid=15d72424f347e-0e8d76ef4eebbe-333f5902-13c680-15d72424f35c4e; thw=cn; miid=1802922913836622752; ali_apache_id=11.128.44.69.1503382547917.223399.7; cna=jX65EV/UIGECAavZYKGdAE5B; ali_ab=221.237.149.70.1497153809618.3; hng=CN%7Czh-CN%7CCNY%7C156; _tb_token_=fef6b737eb65e; cookie2=2d6d69f521f335fdbcbdfc316b765a65; mt=np=&ci=111_1; t=72a90b698f96021fcda47cf74c2a9d21; _cc_=URm48syIZQ%3D%3D; tg=0; _m_h5_tk=194decb65c7af50e5e60116ce0754df7_1512054169444; _m_h5_tk_enc=3b6508333200bf52082631e51d52c4da; CNZZDATA1000005116=2078402807-1512271320-https%253A%252F%252Fsubway.simba.taobao.com%252F%7C1512276611; CNZZDATA1000005136=2105699461-1512271730-https%253A%252F%252Fsubway.simba.taobao.com%252F%7C1512304957; x=407457629; uc3=sg2=UtIHatBaYdTuDE5RcR%2BZzmNKZxChZ48GwUqpB8LsiNM%3D&nk2=&id2=&lg2=; uc1=cookie14=UoTdeYfPRE5PNg%3D%3D&lng=zh_CN; uss=VFQh%2FMmTR57e4jA1l8ATVVthd9NxSkSdbBwWDaHcGtHWXwik6XYDvF2lXA%3D%3D; tracknick=; sn=lansingbike%3Afan; unb=789304910; skt=afe811880143cb52; l=AqenicJwCHgD3wQzhpFpwvWvt9BxLHsO; v=0; JSESSIONID=857CB5B77349789FB21D7F22D5BC4B51; CNZZDATA1000005137=870525305-1512270786-https%253A%252F%252Fsubway.simba.taobao.com%252F%7C1512350609; CNZZDATA1000005141=1246162653-1512268195-https%253A%252F%252Fsubway.simba.taobao.com%252F%7C1512352532; apushda7f530fa6bd3aed56e02fefca06cdd9=%7B%22ts%22%3A1512355911383%2C%22parentId%22%3A1512315593382%7D; isg=Avz8KKVfiqtqwL1kB-kKKciwzZpuXaB7SZhbNtZ9AufKoZwr_gVwr3If9f8i";
                string token = "f93c91de";
                string postData1 = "logsBidwordStr=&adGroupId=813719140&keywords=[{\"word\":\"dd花\",\"matchScope\":4,\"isDefaultPrice\":1,\"maxPrice\":\"0\"}]&analyseTraceId=&_op_context_action_id=&_op_context_data=[{\"adgroup_id\":\"813719140\",\"original\":\"dd花\",\"pack\":{\"source\":\"ZDY\",\"platform\":\"\",\"tags\":null},\"algo_v\":1,\"price_opt\":{\"opt\":\"mr\"}}]&sla=json&isAjaxRequest=true&token=" + token + "&_referer=/campaigns/standards/adgroups/items/detail?tab=bidword&campaignId=&adGroupId=";
                string postData2 = "logsBidwordStr=&adGroupId=813719140&keywords=[{\"word\":\"dd%E8%8A%B1\",\"matchScope\":4,\"isDefaultPrice\":1,\"maxPrice\":\"0\"}]&analyseTraceId=&_op_context_action_id=&_op_context_data=[{\"adgroup_id\":\"813719140\",\"original\":\"dd%E8%8A%B1\",\"pack\":{\"source\":\"ZDY\",\"platform\":\"\",\"tags\":null},\"algo_v\":1,\"price_opt\":{\"opt\":\"mr\"}}]&sla=json&isAjaxRequest=true&token=" + token + "&_referer=/campaigns/standards/adgroups/items/detail?tab=bidword&campaignId=&adGroupId=";
                string postData3 = "logsBidwordStr=&adGroupId=813719140&keywords=%5b%7b%22word%22%3a%22dd%e8%8a%b1%22%2c%22matchScope%22%3a4%2c%22isDefaultPrice%22%3a1%2c%22maxPrice%22%3a%220%22%7d%5d&analyseTraceId=&_op_context_action_id=&_op_context_data=%5b%7b%22adgroup_id%22%3a%22813719140%22%2c%22original%22%3a%22dd%e8%8a%b1%22%2c%22pack%22%3a%7b%22source%22%3a%22ZDY%22%2c%22platform%22%3a%22%22%2c%22tags%22%3anull%7d%2c%22algo_v%22%3a1%2c%22price_opt%22%3a%7b%22opt%22%3a%22mr%22%7d%7d%5d&sla=json&isAjaxRequest=true&token=" + token + "&_referer=%2fcampaigns%2fstandards%2fadgroups%2fitems%2fdetail%3ftab%3dbidword%26campaignId%3d%26adGroupId%3d";
                string postCode = "utf-8";
                postCode = txtCode.Text;
                HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(url);
                HttpWebResponse httpResp = null;
                string postResult = "";
                try
                {
                    httpReq.Method = "POST";
                    httpReq.UserAgent = userAgent;
                    httpReq.Referer = referer;
                    httpReq.Timeout = 25000;
                    httpReq.KeepAlive = true;
                    httpReq.ContentType = "application/x-www-form-urlencoded";
                    httpReq.Headers[HttpRequestHeader.Cookie] = cookies;
                    byte[] bytesData1 = Encoding.GetEncoding(postCode).GetBytes(postData3);
                    httpReq.ContentLength = bytesData1.Length;
                    Stream postStream1 = httpReq.GetRequestStream();
                    postStream1.Write(bytesData1, 0, bytesData1.Length);
                    httpResp = (HttpWebResponse)httpReq.GetResponse();
                    postResult = new StreamReader(httpResp.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd();
                    MessageBox.Show(postResult);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                finally
                {
                    if (httpResp != null)
                    {
                        httpResp.Close();
                    }
                    httpReq.Abort();
                }
                System.Text.RegularExpressions.Match mchWord = System.Text.RegularExpressions.Regex.Match(postResult, "您输入的关键词((?<repeatword>.*?))与已有词重复");
                if (mchWord.Value != "")
                {
                    //如果已有重复,此处就能看见结果是否乱码
                    txtResult.Text = "已有重复,提交词为“dd花”,结果词为:“" + mchWord.Groups["repeatword"].Value + "”";
                    return;
                }
                if (postResult.Contains("\"code\":\"200\",\"msg\":null,"))
                {
                    //postData为提交的结果,200说明提交成功,然后再到另一个页面查看提交的文字结果是否乱码
                    string url2 = "https://subway.simba.taobao.com/bidword/list.htm";
                    string pd2 = "campaignId=3010863&adGroupId=813719140&queryWord=&queryType=0&sla=json&isAjaxRequest=true&token=" + token + "&_referer=%2Fcampaigns%2Fstandards%2Fadgroups%2Fitems%2Fdetail%3Ftab%3Dbidword%26campaignId%3D%26adGroupId%3D";
                    httpReq = (HttpWebRequest)WebRequest.Create(url2);
                    try
                    {
                        httpReq.Method = "POST";
                        httpReq.UserAgent = userAgent;
                        httpReq.Referer = referer;
                        httpReq.Timeout = 25000;
                        httpReq.KeepAlive = true;
                        httpReq.ContentType = "application/x-www-form-urlencoded";
                        httpReq.Headers[HttpRequestHeader.Cookie] = cookies;
                        byte[] bytesData1 = Encoding.GetEncoding("utf-8").GetBytes(pd2);
                        httpReq.ContentLength = bytesData1.Length;
                        Stream postStream1 = httpReq.GetRequestStream();
                        postStream1.Write(bytesData1, 0, bytesData1.Length);
                        httpResp = (HttpWebResponse)httpReq.GetResponse();
                        string htmlResult = new StreamReader(httpResp.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd();
                        txtResult.Text = htmlResult;
                        System.Text.RegularExpressions.MatchCollection mchsWord = System.Text.RegularExpressions.Regex.Matches(htmlResult, "\"keywordId\":\"(?<keywordid>\\d+)\",\"word\":\"(?<word>[^\"]*?)\"");
                        if (mchsWord.Count > 0)
                        {
                            string words = "当前所有词:";
                            foreach (System.Text.RegularExpressions.Match mch in mchsWord)
                            {
                                words += "\r\n" + mch.Groups["word"].Value;
                            }
                            txtResult.Text = words + "\r\n\r\n-----------\r\n" + txtResult.Text;
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                    finally
                    {
                        if (httpResp != null)
                        {
                            httpResp.Close();
                        }
                        httpReq.Abort();
                    }
                }
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 403 天

    [LV.9]以坛为家II

    发表于 2017-12-4 11:17:26 | 显示全部楼层

    该用户从未签到

     楼主| 发表于 2017-12-4 11:17:30 | 显示全部楼层
    本帖最后由 2949497060 于 2017-12-4 11:21 编辑
    站长苏飞 发表于 2017-12-4 09:05
    看你的逻辑是重复编码,编码只需要一次即可。

    我写了3种postdata,第1种是post参数的值没有编码,参数值里的汉字“花”这个字也没有编码;第2种是post参数的值没有编码,但是参数值里的汉字“花”这个字用utf8编码了;第3种是参数里的整个值都全utf8编码了,请飞哥都试试,我目前试的结果都是乱码,而且乱码结果都是dd花

    该用户从未签到

     楼主| 发表于 2017-12-4 11:22:42 | 显示全部楼层
    站长苏飞 发表于 2017-12-4 10:57
    Post的编码设置一下,PostEncoding

    请问怎么设置PostEncoding?我这一段算不算:byte[] bytesData1 = Encoding.GetEncoding(postCode).GetBytes(postData3);?

    该用户从未签到

     楼主| 发表于 2017-12-4 11:28:15 | 显示全部楼层
    站长苏飞 发表于 2017-12-4 11:17
    PostEncoding
    加这个参数测试了吗

    我这一句byte[] bytesData1 = Encoding.GetEncoding(postCode).GetBytes(postData3);,里面的postCode是"utf-8",应该算PostEncoding吧?

    该用户从未签到

     楼主| 发表于 2017-12-4 11:28:56 | 显示全部楼层
    本帖最后由 2949497060 于 2017-12-4 11:49 编辑
    站长苏飞 发表于 2017-12-4 11:17
    PostEncoding
    加这个参数测试了吗

    Encoding.GetEncoding("utf-8")和Encoding.UTF8应该是一样的吧?
    您需要登录后才可以回帖 登录 | 马上注册

    本版积分规则

    QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1 )

    GMT+8, 2017-12-18 13:09

    © 2017-2018

    快速回复 返回顶部 返回列表