如果我在百度里面搜 ray() , 它会编码成 ray%28%29,我这里用C# 的 HttpUtility.UrlEncode(); 结果还是得到 ray(),请问怎么才能编码成向百度这样。

解决方案 »

  1.   

    本帖最后由 net_lover 于 2011-09-23 15:53:46 编辑
      

  2.   

    ( %28
    ) %29是Url编码,你怎么得到的结果,使用Request是经过解码了的。
      

  3.   


    Asp.Net是利用Server下的UrlEncode方法与UrlDncode方法来对Url进行编解码的。
    Server.UrlEncode(string s)--对s进行Url编码:
    Server.UrlDncode(string s)--对s进行Url解码:UrlEncode会将空格编码为+,不会对~Z、a~z、0~9、-、_、.、!、*、\、(、)这些字符编码,因为这些字符是被认为是安全的字符,其它的字符就会被编码成为%开头的十六制的字符。比如,我们对"您好"两个字进行编码:
    示例:protected override void OnInit(EventArgs e)
    {
      Response.Write(Server.UrlEncode("您好"));
    }
    输出:%e6%82%a8%e5%a5%bd我们再将上面编码后的字符解码:
    示例:protected override void OnInit(EventArgs e)
    {
      Response.Write(Server.UrlDecode("%e6%82%a8%e5%a5%bd"));
    }
    输出:您好有的时候,我们在网上下载文件,在网站上看到的文件名是正常的,但在保存提示框中显示的文件名却是乱码,这就是没有对文件名进行编码的原因。注意:
    1,不要对整个Url地址进行编码:例如:protected void Button1_Click(object sender, EventArgs e)
    {
      Response.Redirect(Server.UrlEncode("http://www.lmwlove.com"));
    }
    这样,浏览器就认不到你的Url地址了,因为url上面的url地址已经被编码成http%3a%2f%2fwww.lmwlove.com了。2,#字符是不会被编码的,因为#在url代表的是锚点,有特殊意义,它会截断Url中自身右边的字符,#字符右边的字符是不会发送到服务器端,右边的字符主要用来让浏览器定义到网页中定义好的锚点位置。所以,除了锚点功能外,我们不要在url将#做为参数传递。 
    参考:http://www.lmwlove.com/ac/ID620
      

  4.   

    我觉得百度的这种编码方式是自己写的,LZ完全可以自己实现
    我这里有个是最所以字符都进行编码的,LZ参考下//编码
        public static string Encode(this string str)
        {
            string codeword = "";
            byte[] by = Encoding.Default.GetBytes(str);
            foreach (byte b in by)
            {
                codeword = codeword + "%" + b.ToString("X");
            }
            return codeword;
        }//解码
        public static string Decode(this string str)
        {
            string[] strlist = str.Split(new string[] { "%" }, StringSplitOptions.RemoveEmptyEntries);
            byte[] by = new byte[strlist.Length];
            for (int i = 0; i < strlist.Length; i++)
            {
                string temp = strlist[i];
                int inttemp = ToInt(AnyToTen(temp, 16));
                if (inttemp > 0)
                    by[i] = byte.Parse(inttemp.ToString());
                else
                    return "";
            }
            return Encoding.Default.GetString(by);
        }
      

  5.   

    额..不好意思,ToInt是转换成整数的方法,AnyToTen(temp, 16)是16进制转换成10进制的,LZ可以用其他方法代替
      

  6.   


    private static long Test(string hexStr)
            {
                char[] charList = hexStr.ToCharArray();
                long result = 0;
                for (int i = 0; i < charList.Length; i++)
                {
                    result += HexChar2Dec(charList[charList.Length - 1 - i]) * Power(16, i);
                }
                return result;
            }
    16进制转10进制
      

  7.   

    本帖最后由 net_lover 于 2011-09-23 16:42:15 编辑
      

  8.   

    后来我模拟了一下,这种urlencode不翻译过去也是支持的。
      

  9.   

    学习啦!  可是,百度的不是gbk2312编码吗?
    而google  是  utf-8的,怎么分别把‘您好’分别转换呢?