当前位置: 首页 > 图文教程 > 网络编程 > PHP > 解决了Ajax、MySQL 和 Zend Framework 的乱码问题

PHP
PHP获取网卡地址的代码
生成卡号php代码
PHP循环获取GET和POST值的代码
php实现的在线人员函数库
也谈php网站在线人数统计
php下使用以下代码连接并测试
PHP程序员编程注意事项
Smarty安装配置方法
php5 mysql分页实例代码
php设计模式介绍之值对象模式
修改Zend引擎实现PHP源码加密的原理及实践
php zend解密软件绿色版测试可用
snoopy PHP版的网络客户端提供本地下载
mysql 中InnoDB和MyISAM的区别分析小结
Snoopy类使用小例子
学php必收藏的几个经典代码
php采集速度探究总结(原创)
Mysql中limit的用法方法详解与注意事项
PHP下用rmdir实现删除目录的三种方法小结
Gregarius中文日期格式问题解决办法

PHP 中的 解决了Ajax、MySQL 和 Zend Framework 的乱码问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 122 ::
收藏到网摘: n/a

功夫不负有心人,花了将近一天时间,终于解决了Ajax 、MySQL 和 Zend Framework 的乱码问题。现在总结如下,以供参考。 问题:
在 Google Map 上用 Ajax 以 get 方式向服务器传递数据时,服务器端显示为 url 乱码,
Zend Framework 向 MySQL 存储数据为乱码,但是提取出来又是正常中文字体,
MySQL 中输入中文,显示在 PHP 网页上为乱码。
解决方式:
1. Ajax 的 url 编码需要转换,我使用的如下函数:
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;
}
调用示例: $row->name =XmlController::js_unescape( $this->getRequest()->getParam('name') );
2. 把所有涉及编码的地方都设为 utf8(php) 或 utf-8
MySQL 包括数据库,数据表,字段,数据库连接。
Zend Framework 包括数据连接,视图和html输出。
Ajax 包括 Javascript ,XML 的文件编码和字体编码。
Zend Framework数据连接编码设置:
参考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 直接连接则这样设置:
// Select all the rows in the markers table
$query = "SELECT * FROM markers WHERE 1";
//select 数据库之后加多这一句
mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'");