搜索入口页面是各种页面编码, 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; }