• 搜索关键字乱码问题


    搜索入口页面是各种页面编码, 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;
        }
  • 相关阅读:
    JS 的加密库简介
    十三、行为型模式之解释器、迭代器-----《大话设计模式》
    十二、行为型模式之中介者、访问者、备忘录-----《大话设计模式》
    十一、行为型模式之模板方法、职责链、策略-----《大话设计模式》
    十、行为型模式之观察者、命令、状态-----《大话设计模式》
    十、行为型模式之观察者、命令、状态-----《大话设计模式》
    九、结构型模式之装饰、组合、外观、享元-----《大话设计模式》
    八、结构型模式之适配器、桥接、代理-----《大话设计模式》
    七、创建型模式之建造者、原型、单例-----《大话设计模式》
    六、创建型模式之工厂模式进化史-----《大话设计模式》
  • 原文地址:https://www.cnblogs.com/bandbandme/p/6729414.html
Copyright © 2020-2023  润新知