当网址包含中文时候,不同搜索引擎会有不同的解码方式。海报网 >>GB2312的Encode >>%BA%A3%B1%A8%CD%F8
海报网 >>utf-8的Encode  >>%E6%B5%B7%E6%8A%A5%E7%BD%91如百度默认是无论该网页是何种编码,对中文地址默认是gb2312的解码 如:http://www.baidu.com/s?bs=site%3Ahaibao.cn+inurl%3A%B7%FE%CA%CE%B4%EE%C5%E4&f=8&wd=site%3Ahaibao.cn+inurl%3A%BA%A3%B1%A8%CD%F8
第一位该网页是utf-8的 ,但百度解码后地址是 http://www.haibao.cn/zhuanti/%BA%A3%B1%A8%CD%F8/google对中文url地址默认是utf-8的http://www.google.com.hk/search?hl=zh-CN&source=hp&q=site%3Ahaibao.cn+inurl%3A%E6%B5%B7%E6%8A%A5%E7%BD%91&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f&aqi=&aql=&oq=&gs_rfai=
第二位,同样一个地址google解码后地址是 http://www.haibao.cn/zhuanti/%E6%B5%B7%E6%8A%A5%E7%BD%91/现在程序是dedecms的。
无论何种编码怎样让以下三个网址都能正常访问到。可以打开 http://www.chinaz.com/tag.php?/%CD%F8%D2%B3%C9%E8%BC%C6/
可以打开 http://www.chinaz.com/tag.php?/网页设计/
解码错误 http://www.chinaz.com/tag.php?/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/

解决方案 »

  1.   

    这样的情况,LZ可以分情况处理,
    if(goole){
    }elseif(baidu){
    }else{
    }
    不同的网站用不同的解析,问题不就解决了.
      

  2.   

    if(isset($_SERVER['QUERY_STRING']))
    {
    $tag = mb_convert_encoding($_SERVER['QUERY_STRING'],"UTF-8","GBK");
    $tags = explode('/', $tag);
            $tags = mb_detect_encoding($tags,array("GBK"));    //判断字符串是不是GBK的%BA%A3%B1%A8%CD%F8 。
            if ($tags == "GBK")                               
           {
             $tags = iconv("GBK","utf-8//IGNORE",$tags);       //如果是就转换为UTF-8的编码 
            }
    if(isset($tags[1]))
    {
    $tag = $tags[1];
    }
    if(isset($tags[2]))
    {
    $PageNo = intval($tags[2]);
    }}
    else
    {
    $tag = '';
    }$tag = FilterSearch(urldecode($tag));========================
    上面是我修改的,貌似这样不行!
    可以打开 http://www.xx.com/tag.php?/%CD%F8%D2%B3%C9%E8%BC%C6/
    可以打开 http://www.xx.com/tag.php?/网页设计/
    解码错误 http://www.xx.com/tag.php?/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/
      

  3.   

    你这样不行啊,你转换的话,就是把 E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1  这样的字串转换成utf8的了,不对吧,
      

  4.   

    恩。请问怎样修改才能支持这三种形式的URL呢?
      

  5.   

     function is_utf8($string) {
      
       // From http://w3.org/International/questions/qa-forms-utf-8.html
       return preg_match('%^(?:
             [\x09\x0A\x0D\x20-\x7E]            # ASCII
           | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
           |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
           | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
           |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
           |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
           | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
           |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
       )*$%xs', $string);
       
    } // function is_utf8if(! is_utf8($_SERVER['QUERY_STRING'])) {
      $_SERVER['QUERY_STRING'] = iconv('gbk', 'utf-8', $_SERVER['QUERY_STRING']);
    }
    ...