如题,我做了个利用百度来做搜索的假搜索引擎,就是用TextBox获取搜索关键词,然后传给百度来搜,再把返回的字符流输出到页面 string wd = Request.Form["wd"];

WebRequest wrq = WebRequest.Create("http://www.baidu.com/s?wd="+wd+"&cl=3");
WebResponse wrs = wrq.GetResponse();
Stream strm = wrs.GetResponseStream();
StreamReader sr = new StreamReader(strm,System.Text.Encoding.GetEncoding( "gb2312" ));
            
string allstrm;
allstrm = sr.ReadToEnd(); Response.Write(allstrm);

strm.Close();
为什么搜索词是数字,字母就没有问题,是汉字的话,返回的就是乱码呢?

解决方案 »

  1.   

    试试这样行不?
    ("http://www.baidu.com/s?wd="+Server.UrlEncode(wd)+"&cl=3");
      

  2.   

    不行的话:
    string wd = "关键字";
    string s = Encoding.Default.GetString(Encoding.UTF8.GetBytes(wd));
    WebRequest wrq = WebRequest.Create("http://www.baidu.com/s?wd=" + Server.UrlEncode(s) + "&cl=3");
      

  3.   

    再不行就把你的Web.Config中:
    <globalization 
                requestEncoding="utf-8" 
                responseEncoding="utf-8" 
       />
    utf-8全改为:GB2312
      

  4.   

    试试Server.UrlEncode,应该可以的,百度的汉字就是这样编码的
      

  5.   

    我用Server.UrlEncode编码出来的字串和百度的比较,根本不一样.在网上查了下.原来他是这样编码的:使用百度和google进行搜索时,会对关键字进行编码,它们的编码方式不一样,如搜索中国两个字:
    baidu的编码:%D6%D0%B9%FA
    google的编码:%E4%B8%AD%E5%9B%BD具体的编/解码原理我不懂,只是在网上找到了相应的解码函数,如下:baidu:
    <%
    function URLDecode(enStr)
      dim  deStr,strSpecial
      dim  c,i,v
      deStr=""
      strSpecial="!""#$%&'()*+,/:;<=>?@[\]^`{ |}~%"
      for  i=1  to  len(enStr)
        c=Mid(enStr,i,1)
        if  c="%"  then
        v=eval("&h"+Mid(enStr,i+1,2))
        if  inStr(strSpecial,chr(v))>0  then
        deStr=deStr&chr(v)
        i=i+2
        else
        v=eval("&h"+Mid(enStr,i+1,2)+Mid(enStr,i+4,2))
        deStr=deStr&chr(v)
        i=i+5
        end  if
        else
        if  c="+"  then
        deStr=deStr&" "
        else
        deStr=deStr&c
        end  if
        end  if
      next
      URLDecode=deStr
    end function
    %>
    ---------------------
    google:
    <%
    function U8Decode(enStr)
      '输入一堆有%分隔的字符串,先分成数组,根据utf8规则来判断补齐规则
      '输入:关 E5 85 B3  键  E9 94 AE 字   E5 AD 97
      '输出:关 B9D8  键  BCFC 字   D7D6
      dim c,i,i2,v,deStr,WeiS  for i=1 to len(enStr)
        c=Mid(enStr,i,1)
        if c="%" then
          v=c16to2(Mid(enStr,i+1,2))
          '判断第一次出现0的位置,
          '可能是1(单字节),3(3-1字节),4,5,6,7不可能是2和大于7
          '理论上到7,实际不会超过3。
          WeiS=instr(v,"0")
          v=right(v,len(v)-WeiS)'第一个去掉最左边的WeiS个
          i=i+3
          for i2=2 to WeiS-1
            c=c16to2(Mid(enStr,i+1,2))
            c=right(c,len(c)-2)'其余去掉最左边的两个
            v=v & c
            i=i+3
          next
          if len(c2to16(v)) =4 then
            deStr=deStr & chrw(c2to10(v))
          else
            deStr=deStr & chr(c2to10(v))
          end if
          i=i-1
        else
          if c="+" then
            deStr=deStr&" "
          else
            deStr=deStr&c
          end if
        end if
      next
      U8Decode = deStr
    end functionfunction c16to2(x)
     '这个函数是用来转换16进制到2进制的,可以是任何长度的,一般转换UTF-8的时候是两个长度,比如A9
     '比如:输入“C2”,转化成“11000010”,其中1100是"c"是10进制的12(1100),那么2(10)不足4位要补齐成(0010)。
     dim tempstr
     dim i:i=0'临时的指针 for i=1 to len(trim(x))
      tempstr= c10to2(cint(int("&h" & mid(x,i,1))))
      do while len(tempstr)<4
       tempstr="0" & tempstr'如果不足4位那么补齐4位数
      loop
      c16to2=c16to2 & tempstr
     next
    end functionfunction c2to16(x)
      '2进制到16进制的转换,每4个0或1转换成一个16进制字母,输入长度当然不可能不是4的倍数了  dim i:i=1'临时的指针
      for i=1 to len(x)  step 4
       c2to16=c2to16 & hex(c2to10(mid(x,i,4)))
      next
    end functionfunction c2to10(x)
      '单纯的2进制到10进制的转换,不考虑转16进制所需要的4位前零补齐。
      '因为这个函数很有用!以后也会用到,做过通讯和硬件的人应该知道。
      '这里用字符串代表二进制
       c2to10=0
       if x="0" then exit function'如果是0的话直接得0就完事
       dim i:i=0'临时的指针
       for i= 0 to len(x) -1'否则利用8421码计算,这个从我最开始学计算机的时候就会,好怀念当初教我们的谢道建老先生啊!
        if mid(x,len(x)-i,1)="1" then c2to10=c2to10+2^(i)
       next
    end functionfunction c10to2(x)
    '10进制到2进制的转换
      dim sign, result
      result = ""
      '符号
      sign = sgn(x)
      x = abs(x)
      if x = 0 then
        c10to2 = 0
        exit function
      end if
      do until x = "0"
        result = result & (x mod 2)
        x = x \ 2
      loop
      result = strReverse(result)
      if sign = -1 then
        c10to2 = "-" & result
      else
        c10to2 = result
      end if
    end function
    %>
      

  6.   

    汗,终于找到原因:
    ASP.net 中的 Server.UrlEncode 默认是按照 UTF-8 编码方式进行处理的

    Response.Write(HttpUtility.UrlEncode("中国",Encoding.Default));
    编码出来的就是和百度一样的方式.也就是GB2312
      

  7.   

    把webconfig里面的改了就可以传递中文了如果有问题,可以用
    Response.Charset = "gb2312";
      

  8.   

    测试如下:
    private void Page_Load(object sender, System.EventArgs e)
    {
     //在此处放置用户代码以初始化页面
    string wd ="中国";
    wd=HttpUtility.UrlEncode(wd,Encoding.Default);
    WebRequest wrq = WebRequest.Create("http://www.baidu.com/s?wd="+wd+"&cl=3");
    WebResponse wrs = wrq.GetResponse();
    Stream strm = wrs.GetResponseStream();
    StreamReader sr = new StreamReader(strm,System.Text.Encoding.GetEncoding( "gb2312" ));
                
    string allstrm;
    allstrm = sr.ReadToEnd(); Response.Write(allstrm);
    strm.Close();
    }
      

  9.   

    哈,之前看了3楼hzw66(超越理想)兄的指教已经解决此问题,没想到还能从karykwan(独行者)兄这里学到关于百度引擎更多的东西,一并谢过。