解决了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'");