解決了Ajax、MySQL 和 Zend Framework 的亂碼問(wèn)題
更新時(shí)間:2009年03月03日 22:35:00 作者:
功夫不負(fù)有心人,花了將近一天時(shí)間,終于解決了Ajax 、MySQL 和 Zend Framework 的亂碼問(wèn)題?,F(xiàn)在總結(jié)如下,以供參考。
問(wèn)題:
在 Google Map 上用 Ajax 以 get 方式向服務(wù)器傳遞數(shù)據(jù)時(shí),服務(wù)器端顯示為 url 亂碼,
Zend Framework 向 MySQL 存儲(chǔ)數(shù)據(jù)為亂碼,但是提取出來(lái)又是正常中文字體,
MySQL 中輸入中文,顯示在 PHP 網(wǎng)頁(yè)上為亂碼。
解決方式:
1. Ajax 的 url 編碼需要轉(zhuǎn)換,我使用的如下函數(shù):
public function js_unescape($str)
{
$ret = '';
$len = strlen($str);
for ($i = 0; $i < $len; $i++)
{
if ($str[$i] == '%' && $str[$i+1] == 'u')
{
$val = hexdec(substr($str, $i+2, 4));
if ($val < 0x7f) $ret .= chr($val);
else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));
else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));
$i += 5;
}
else if ($str[$i] == '%')
{
$ret .= urldecode(substr($str, $i, 3));
$i += 2;
}
else $ret .= $str[$i];
}
return $ret;
}
調(diào)用示例: $row->name =XmlController::js_unescape( $this->getRequest()->getParam('name') );
2. 把所有涉及編碼的地方都設(shè)為 utf8(php) 或 utf-8
MySQL 包括數(shù)據(jù)庫(kù),數(shù)據(jù)表,字段,數(shù)據(jù)庫(kù)連接。
Zend Framework 包括數(shù)據(jù)連接,視圖和html輸出。
Ajax 包括 Javascript ,XML 的文件編碼和字體編碼。
Zend Framework數(shù)據(jù)連接編碼設(shè)置:
參考http://phpeye.com/bbs/redirect.php?fid=2&tid=81&goto=nextoldset
Zend_Db_Table::setDefaultAdapter($dbAdapter);
Zend_Registry::set('dbAdapter', $dbAdapter);
$dbAdapter->query("SET NAMES 'utf8'");
如果是 PHP 直接連接則這樣設(shè)置:
// Select all the rows in the markers table
$query = "SELECT * FROM markers WHERE 1";
//select 數(shù)據(jù)庫(kù)之后加多這一句
mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'");
在 Google Map 上用 Ajax 以 get 方式向服務(wù)器傳遞數(shù)據(jù)時(shí),服務(wù)器端顯示為 url 亂碼,
Zend Framework 向 MySQL 存儲(chǔ)數(shù)據(jù)為亂碼,但是提取出來(lái)又是正常中文字體,
MySQL 中輸入中文,顯示在 PHP 網(wǎng)頁(yè)上為亂碼。
解決方式:
1. Ajax 的 url 編碼需要轉(zhuǎn)換,我使用的如下函數(shù):
public function js_unescape($str)
{
$ret = '';
$len = strlen($str);
for ($i = 0; $i < $len; $i++)
{
if ($str[$i] == '%' && $str[$i+1] == 'u')
{
$val = hexdec(substr($str, $i+2, 4));
if ($val < 0x7f) $ret .= chr($val);
else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));
else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));
$i += 5;
}
else if ($str[$i] == '%')
{
$ret .= urldecode(substr($str, $i, 3));
$i += 2;
}
else $ret .= $str[$i];
}
return $ret;
}
調(diào)用示例: $row->name =XmlController::js_unescape( $this->getRequest()->getParam('name') );
2. 把所有涉及編碼的地方都設(shè)為 utf8(php) 或 utf-8
MySQL 包括數(shù)據(jù)庫(kù),數(shù)據(jù)表,字段,數(shù)據(jù)庫(kù)連接。
Zend Framework 包括數(shù)據(jù)連接,視圖和html輸出。
Ajax 包括 Javascript ,XML 的文件編碼和字體編碼。
Zend Framework數(shù)據(jù)連接編碼設(shè)置:
參考http://phpeye.com/bbs/redirect.php?fid=2&tid=81&goto=nextoldset
Zend_Db_Table::setDefaultAdapter($dbAdapter);
Zend_Registry::set('dbAdapter', $dbAdapter);
$dbAdapter->query("SET NAMES 'utf8'");
如果是 PHP 直接連接則這樣設(shè)置:
// Select all the rows in the markers table
$query = "SELECT * FROM markers WHERE 1";
//select 數(shù)據(jù)庫(kù)之后加多這一句
mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'");
您可能感興趣的文章:
- ZendFramework2連接數(shù)據(jù)庫(kù)操作實(shí)例
- Zend Framework數(shù)據(jù)庫(kù)操作技巧總結(jié)
- Zend Framework入門(mén)應(yīng)用實(shí)例詳解
- Zend Framework前端控制器用法示例
- Zend Framework路由器用法實(shí)例詳解
- Zend Framework分發(fā)器用法示例
- Zend Framework動(dòng)作控制器用法示例
- Zend Framework處理Json數(shù)據(jù)方法詳解
- Zend Framework使用Zend_Loader組件動(dòng)態(tài)加載文件和類(lèi)用法詳解
- Zend Framework實(shí)現(xiàn)自定義過(guò)濾器的方法
- WINDOWS + WAMP + Zend Framework 配置步驟分享
- Zend Framework框架中實(shí)現(xiàn)Ajax的方法示例
相關(guān)文章
比f(wàn)ile_get_contents穩(wěn)定的curl_get_contents分享
相信使用過(guò)file_get_contents函數(shù)的朋友都知道,當(dāng)獲取的$url訪問(wèn)不了時(shí),會(huì)導(dǎo)致頁(yè)面漫長(zhǎng)的等待,甚至還能導(dǎo)致PHP進(jìn)程占用CPU達(dá)100%,因此這個(gè)函數(shù)就誕生了2012-01-01
php array 轉(zhuǎn)json及java 轉(zhuǎn)換 json數(shù)據(jù)格式操作示例
這篇文章主要介紹了php array 轉(zhuǎn)json及java 轉(zhuǎn)換 json數(shù)據(jù)格式操作,結(jié)合實(shí)例形式分析了PHP針對(duì)array數(shù)組轉(zhuǎn)json以及Java操作Map、List、對(duì)象與json格式轉(zhuǎn)換的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-11-11
也談php網(wǎng)站在線人數(shù)統(tǒng)計(jì)
db層: db_online.PHP //該函數(shù)使用戶自己在線,并且檢查其他用戶的在線情況2008-04-04
php實(shí)現(xiàn)通過(guò)cookie換膚的方法
這篇文章主要介紹了php實(shí)現(xiàn)通過(guò)cookie換膚的方法,通過(guò)cookie存儲(chǔ)用戶選擇信息實(shí)現(xiàn)換膚效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
使用NetBeans + Xdebug調(diào)試PHP程序的方法
前些天發(fā)現(xiàn)通過(guò)Notepad++的DBGP插件結(jié)合PHP的xdebug擴(kuò)展可以實(shí)現(xiàn)PHP文件調(diào)試,同時(shí),介紹說(shuō)包含了單步調(diào)試、監(jiān)視變量還有跨文件調(diào)試。2011-04-04
PHP觀察者模式原理與簡(jiǎn)單實(shí)現(xiàn)方法示例
這篇文章主要介紹了PHP觀察者模式原理與簡(jiǎn)單實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了php觀察者模式的概念、原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08

