搜索关键字乱码问题

搜索入口页面是各种页面编码, gbk, gb2312, utf8

搜索控制器是utf8编码脚本,前台展示是gbk

处理不完成出现各种搜索词乱码问题

现处理如下:

前端跳转

页面编码utf8 表单提交

function search_go()
          {
            
              var key_word = document.getElementById('J_search_key').value;
              
                if(key_word==''||key_word=='请输入产品名称、品牌或关键字')
                {
                    return false;
                }
                else
                {
                    key_word = encodeURI(encodeURI(key_word));
                    var url = 'http://so.kimiss.com/?keyword='+key_word+'&idx=10';
                
                    window.open(url);
                    return false;
                }
          }

form表单

<form method="get" action="http://xxx.com/" target="_blank" accept-charset="gb2312">
            <div class="mainsearch">
                <input type="text" name="keyword" class="main_input" value="乳液" id="J_search_key">
            </div>
            <input type="submit" value="搜索" id="search" class="mainbtn">
            </form>

页面编码gbk 设置为一个a标签的href值,自动出发a标签点击事件

var url = 'http://xxx.com/?keyword='+decodeURI(key_word)+'&idx='+mainvalue;

openwin(url);

function openwin(url) {
    var obj = document.getElementById("openfriend");   
      obj.href = url;   
      if(document.all){  
          obj.click();  
      }else {  
          var evt = document.createEvent("MouseEvents");
          evt.initEvent("click", true, true);  
          obj.dispatchEvent(evt);  
      }  
}

页面编码为gbk, 表单提交

function search_go(){
          var key_word = document.getElementById('f_search_txt').value;
            if(key_word==''||key_word=='请输入产品名称、品牌或关键字')
            {
                return false;
            }
            else
            {
                document.getElementById('schForm').submit();
                return false;
            }
      }

form表单

<form method="get" action="http://xxx.com/" target="_blank" id="schForm">
                    <div class="f_mainsearch">
                        <input type="text" id="f_search_txt" value="请输入产品名称、品牌或关键字" class="f_main_input" name="keyword"/>
                    </div>
                    <input type="button" onclick="search_go();" value="搜索" id="search" class="f_mainbtn"/>
                </form>

后端控制器

/**
     * 对搜索关键词进行特殊处理
     * @return type
     */
    protected function getKeyWord() {
            
        //那我存储关键词的时候也使用这个方法来存储。看看长度是否定长 
        
        $word = Request::get('keyword', array(Filter::TRIM));

        //因为产品别名有英文空格,忽略空格过滤
        if(!preg_match('/[a-zA-Z]/',$word)){
            $word = str_replace(' ','',$word);
        }
        
        $encode = mb_detect_encoding($word,array("GB2312", "GBK","UTF-8","ASCII") );

        /* old
        // url编码了     词“水芝澳啫喱面霜” = CP936 (特殊), 香奈儿香水=EUC-CN (通用)
        // 如果url中搜索词不是编码式的 encode=cp936 可以不进行编码转换

        if ($encode != 'UTF-8' && $encode != 'CP936' && strpos(Convert::u82gb($word), '?') === 0) { //$encode != 'UTF-8' || $encode
            $word = iconv('gbk', 'UTF-8', $word);
        }

        //排查发现上面一个转码会不成功,增加一个编码转码   gb2312 == EUC-CN   gb2312 == CP936
        $encode = mb_detect_encoding($word,array("GB2312", "GBK","UTF-8","ASCII") );
        if($encode != 'CP936'){
            if($encode != 'UTF-8'){
                $word = iconv('gb2312','utf-8',$word);
            }
        }*/
        
        /**
         * 上面那块判断好乱,导致目前线上搜素中文词部分乱码问题,统一字符入口判断 非utf-8 统一转为utf-8
         * 返现一个奇怪问题  部分中文词EUC-CN 通过utf-8转码之后,再检测编码为CP936 但是搜索结果正常  update by liu.xin@onlylady.com
         * u 此修正符打开一个与perl不兼容的附加功能. 模式字符串被认为是utf-8的
         */
         $notUtf8 = !(bool)preg_match('//u', serialize($word));
        if( $notUtf8 ){
            $word = mb_convert_encoding($word, 'UTF-8', $encode);
        }
        // 卸妆 检测编码为 EUC-CN, 但是 $notUtf8 却为false, 好奇怪
        if($encode == 'EUC-CN' && !$notUtf8) {
            $word = mb_convert_encoding($word, 'UTF-8', $encode);
        }
        
        if (strpos($word, '?') === FALSE) {
            $word = addslashes($word);
        }
        
        
        $word = String::suitLength($word, 30, false, '');
        
        # 转换词典。将用户的搜索词,转成有效词。(不是同义词概念)
        $transform_dict = array(
            'sk2' => 'SK-II',
        );
        foreach ($transform_dict as $old_word => $new_word) {
            $word = str_ireplace($old_word, $new_word, $word);
        }

        # 特殊处理  草莓网 入住品牌吧 (其实就是一个专题)
        if ($word == '草莓网' || $word == '草莓?') {
            header("Location: http://xxxx/topic/TheBerries.html");
            exit;
        }
        #特殊处理 赫拉 Hera  跳转到:http://xxxxx/brand/1329/
        in_array($word, array('赫拉','HOLA','hola','Hola'));
        if ($word == '赫拉' || $word == 'HOLA' || $word == 'hola'  ) {
            header("Location: http://xxxxx/brand/4653/");
            exit;
        }

        return $word;
    }
原文地址:https://www.cnblogs.com/bandbandme/p/6729414.html