好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP数组传递给JavaScript以及json_encode的gbk中文乱码

PHP数组传递给JavaScript以及json_encode的gbk中文乱码

文章介绍了关于PHP数组传递给JavaScript以及json_encode的gbk中文乱码的解决 ,下面是创建JSON函数,这一段来自网上某一位大侠

/**************************************************************    *   *    使用特定function对数组中所有元素做处理   *    @param    string    &$array        要处理的字符串   *    @param    string    $function    要执行的函数   *    @return boolean    $apply_to_keys_also        是否也应用到key上   *    @access public   *   *************************************************************/   function  arrayRecursive(& $array ,  $function ,  $apply_to_keys_also  = false)  {       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 ]);              }          }      }  }  /**************************************************************    *   *    将数组转换为JSON字符串(兼容中文)   *    @param    array    $array        要转换的数组   *    @return string        转换得到的json字符串   *    @access public   *   *************************************************************/   function  JSON( $array ) {      arrayRecursive( $array ,  'urlencode' , true);       $json  = json_encode( $array );       return  urldecode( $json );  }  连接数据库取值给数组 $array1    代码如下 复制代码  $dbcnx  = @mysql_connect (  "localhost" ,  "root" ,  "1234"  );  if  (!  $dbcnx ) {       echo  ( "Unable to connect to the "  .  "database server at this time." );       exit  ();  }  if  (! @mysql_select_db (  "pms"  )) {       echo  ( "Unable to locate the joke "  .  "database at this time." );       exit  ();  }  mysql_query (  "SET NAMES 'GB2312'"  );       $q =mysql_query( "select * from ability where ALV = 1" );        while ( $row =mysql_fetch_array( $q )){         $array1 [] =  $row [AName];  } 
<script type= "text/javascript"  src= "JS/jquery-1.7.2.min.js" ></script>  <script type= "text/javascript" >  var  ability1=<?php  echo  JSON( $array1 );?>;  var  a= eval ( "ability1" );  alert(a[0]);  </script> 

另一种json中文乱码解决方法,如果是中文的话就要注意了,在网上找到一种解决方法:

<?php   /* 处理json_encode中文乱码 */    $data  =  array  ( 'game'  =>  '冰火国度' ,  'name'  =>  '刺之灵' ,  'country'  =>  '冰霜国' ,  'level'  => 45 );   echo  json_encode (  $data  );   echo   "<br>" ;   $newData  =  array  ();   foreach  (  $data   as   $key  =>  $value  ) {   $newData  [ $key ] = urlencode (  $value  );   }   echo  urldecode ( json_encode (  $newData  ) );   ?> 

后来请教了别人,还可以用base64编码,不过base64编码不可以放在URL中,百度是这样解释的:标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的[/]和[+]字符变为形如[%XX]的形式,而这些[%]号在存入数据库时还需要再进行转换,因为ANSI SQL中已将[%]号用作通配符。

不过我的数据是要通过POST发送的,并不在HTTP 的head中,而在message-body里,所以不受影响。

json_encode 只能接受utf-8格式的数据

例如:'胥'经过json_encode处理后变为'u80e5',最终的json中中文部分被替换为unicode编码。我们要解决的就是将对象转换为json并保证对象内部的中文在json中仍然是以正常的中文出现,现在看来只使用json_encode是不能达到目的的.

我的解决方法:先将类中的中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)json,即最终的json,里面的中文依旧是那个中文! 测试代码如下:

<?php   class  myClass {   public   $item1  = 1;   public   $item2  =  '中文' ;   function  to_json() {   //url编码,避免json_encode将中文转为unicode    $this ->item2 = urlencode( $this ->item2);   $str_json  = json_encode( $this );   //url解码,转完json后将各属性返回,确保对象属性不变    $this ->item2 = urldecode( $this ->item2);   return  urldecode( $str_json );   }   }   $c  =  new  myClass();   echo  json_encode( $c );   echo   '<br/>' ;   echo   $c ->to_json();   echo   '<br/>' ;   echo  json_encode( $c );   echo   '<br/>' ;   echo  json_encode( '胥' );   ?> 

程序输出结果:

{ "item1" :1, "item2" : "u4e2du6587" }   { "item1" :1, "item2" : "中文" }   { "item1" :1, "item2" : "u4e2du6587" }   "u80e5"  

查看更多关于PHP数组传递给JavaScript以及json_encode的gbk中文乱码的详细内容...

  阅读:46次