web應用開發中經常出現中文亂碼情況!
今天主要整理下思路:
出現亂碼的大多數情況是我們進行AJAX時所遇到的!因為直接數據庫讀取是不會有任何編碼上的問題的~
1.從前台JS提交數據到后台的情況下
AJAX數據時,不管是直接用底層xmlHttprequest還是用jQuery的ajax進行數據傳遞時!ajax都會使用utf-8進行編碼后發送!
如果我們的頁面是UTF-8那沒有問題!傳遞過去的中文數據不會亂碼!
如果是GB2312的話~問題就來了!GBK被UTF-8轉換后發送到后台,這時后台直接接收到的已經亂碼了!
(解決方法:后台語言為PHP的情況下,iconv('utf-8','gb2312',$_POST['Data']);)
原理很簡單:后台直接接收是utf-8,而頁面都是GBK,那只要把接收到的數據再重新轉回為GBK就可以了!
這時再做數據庫操作就可以了!存入數據庫里的必定是正常的中文字符了!
2.后台頁面讀取到數據庫里數據中含有中文字符,此時再回傳到JS前台的情況下
PHP頁面從數據庫里讀取到了正常的中文字符想通過AJAX再回傳回去~
如果傳遞回去只是把數據不作任何處理直接以字符串的形式傳回去!這是沒有問題的!中文在前台頁面上顯示一切正常!
但后台數據我們一般是需要包裝一下!不然前台接收到的數據會很難處理!
如果是PHP的話!那么我們現在一般用JSON進行傳遞!這樣傳遞到前台JS的數據就會非常容易解開並操作!
在PHP后台進行json轉換操作時,問題就來了!
json轉換時會發現從數據庫讀取出來的中文又出現NULL或其它不正常的情況,這是因為JSON只轉義encoding編碼!咱也甭管他轉義什么編碼!
反正JSON轉中文出現亂碼的情況~~
解決辦法如下:
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
static $recursive_counter = 0;
if (++$recursive_counter > 1000) {
die('possible deep recursion attack');
}
foreach ($array as $key => $value) {
if (is_array($value)) {
arrayRecursive($array[$key], $function, $apply_to_keys_also);
} else {
$array[$key] = $function($value);
}
if ($apply_to_keys_also && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter--;
}
function JSON($array) {
arrayRecursive($array, 'urlencode', true);
$json = json_encode($array);
return urldecode($json);
}
$json_string=JSON($data);
//$obj = json_decode($json_string);
print_r($json_string);
經過這些處理后你會發現后台PHP從數據庫讀出來的中文字符成功的轉成了json格式並且中文顯示一切正常!
當然此時前台接收到的數據就是JSON格式的了並且中文字符也是正常!
好了~~就是這些思路~網上方法有很多!看得有點亂~主要是記住思路!
然后就看用什么函數用什么方法解決相關編碼問題就可以了!
比較煩那種JS前台AJAX需要轉碼!后台再解碼!有的還需要轉兩次!
目前我寫的這些都是在PHP后台語言代碼的情況下有效的.
前台即使是GBK也不用作任何轉碼操作,全部只在后台PHP代碼里面作相關轉換就可以了!!