1. 程式人生 > >解決ThinkPHP中以Get方式提交中文字元亂碼

解決ThinkPHP中以Get方式提交中文字元亂碼

接觸thinkPHP還沒幾天,都還沒入門呢,因為公司專案非常著急,自己也對thinkPHP很有興趣想借機會提高一下,就著急的用thinkPHP開始了,當然是遇到了非常多的問題,不過還好通過朋友gidot的幫助及網路還有官方的手冊,基本都解決了。

這幾天又遇到個問題,就是GET提交中文會亂碼的問題。在論壇看了下好像很多人都有而且也沒個好的解決辦法。
資料庫、頁面編碼、檔案保編碼這些全都是UTF8是100%確定沒有問題的。
有的人提供的說可行的方法,到我這裡也不行,可能是因為我環境是WIDNOWS2003+IIS6.0的預設字符集為中文有關係。試遍了各種方法始終不行。

後來看說客戶端base64編碼了再發送請求,然後伺服器上再BASE64解碼。試了下,發現PHP的base64結果居然和JS的不一樣-_-|||,後來想,問題是出在傳遞時的編碼上,用base64也只是把字元轉換成字母以避免被再次編碼解碼出現問題。
既然如此,那自己寫個簡單的編解碼應該也能解決,試了下,果然解決了,現在分享一下我的方法。

先給客戶端傳送出的資料,編碼一下,免得傳遞時被瀏覽器編碼了到伺服器出問題,我的解決辦法是,傳送表單時,先用JS給字元encodeURI編碼了,然後將裡面的百分號“%”替換成別的不會被編碼的字元(注意這個字元要比較特別,不要和使用者輸入的字元混淆,也不能過長,考慮到一個字元容易和使用者輸入混淆,我選了3個字元“.s.”,),再讓表單傳送。具體實現:

程式程式碼 <form method='get' id="search1" action="__URL__">
<input value="{$Think.get.group_name|getChineseGetValue}" type="text" name="group_name"id="group_name" title="組名查詢" class="medium" >
<html:imageBtn type="button"click="getId('group_name').value=encodeURI(getId('group_name').value).replace(/%/g,'.s.');
getId('search1').submit();"class="search imgButton" value="查詢" style="impBtn hMargin fLeft shadow" />
</form>


然後在伺服器端寫個函式,把我們編碼的資料解碼成正常的:
程式程式碼
//解碼GET傳值
function getChineseGetValue($key){
if (strlen($key)>0){
  return urldecode(str_replace('.s.','%',$key));
}
}



然後我們接收引數查詢時要解碼:
程式程式碼 $map['group_name'] = array('like',"%".getChineseGetValue($_GET['group_name'])
."%");


最後在頁面顯示GET值的時候,也要解碼:
程式程式碼
<form method='get' id="search1" action="__URL__">
<input value="{$Think.get.group_name|getChineseGetValue}" type="text" name="group_name" id="group_name" title="組名查詢" class="medium" >
<html:imageBtn type="button" click="getId('group_name').value=encodeURI(getId('group_name').value).replace(/%/g,'.s.');getId('search1').submit();" class="search imgButton" value="查詢" style="impBtn hMargin fLeft shadow" />
</form>



這樣就可以了,希望本帖對有此問題的童鞋能有所幫助,
附帶說明下,那個 getId 是我的一個JS函式,偷懶用的(可以不用那麼麻煩的老寫document.getElementById……),程式碼如下:
程式程式碼 function getId(id){
return document.getElementById(id);
}