搜索關鍵字亂碼問題


 

搜索入口頁面是各種頁面編碼, 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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM