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