解決ThinkPHP中以Get方式提交中文字元亂碼
?
接觸thinkPHP還沒幾天,都還沒入門呢,因為公司項目非常著急,自己也對thinkPHP很有興趣想藉機會提高一下,就著急的用thinkPHP開始了,當然是遇到了非常多的問題,不過還好通過朋友gidot的協助及網路還有官方的手冊,基本都解決了。
這幾天又遇到個問題,就是GET提交中文會亂碼的問題。在論壇看了下好像很多人都有而且也沒個好的解決辦法。
資料庫、頁面編碼、檔案保編碼這些全都是UTF8是100%確定沒有問題的。
有的人提供的說可行的方法,到我這裡也不行,可能是因為我環境是WIDNOWS2003+IIS6.0的預設字元集為中文有關係。試遍了各種方法始終不行。
後來看說用戶端base64編碼了再發送請求,然後伺服器上再BASE64解碼。試了下,發現PHP的base64結果居然和JS的不一樣-_-|||,後來想,問題是出在傳遞時的編碼上,用base64也只是把字元轉換成字母以避免被再次編碼解碼出現問題。
既然如此,那自己寫個簡單的編解碼應該也能解決,試了下,果然解決了,現在分享一下我的方法。
先給用戶端發送出的資料,編碼一下,免得傳遞時被瀏覽器編碼了到伺服器出問題,我的解決辦法是,發送表單時,先用JS給字元encodeURI編碼了,然後將裡面的百分比符號“%”替換成別的不會被編碼的字元(注意這個字元要比較特別,不要和使用者輸入的字元混淆,也不能過長,考慮到一個字元容易和使用者輸入混淆,我選了3個字元“.s.”,),再讓表單發送。具體實現:
程式碼
然後在伺服器端寫個函數,把我們編碼的資料解碼成正常的:
程式碼
//解碼GET傳值
function getChineseGetValue($key){
if (strlen($key)>0){
??return?urldecode(str_replace('.s.','%',$key));
}
}
然後我們接收參數查詢時要解碼:
程式碼
$map['group_name'] = array('like',"%".getChineseGetValue($_GET['group_name'])."%");
最後在頁面顯示GET值的時候,也要解碼:
程式碼
這樣就可以了,希望本帖對有此問題的童鞋能有所協助,
附帶說明下,那個 getId 是我的一個JS函數,偷懶用的(可以不用那麼麻煩的老寫document.getElementById……),代碼如下:
程式碼
function getId(id){
return document.getElementById(id);
}
?