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

 代码如下 复制代码

/**************************************************************
 *
*    使用特定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];
}

数组array1传递到JavaScript给数组ability1

 代码如下 复制代码

<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"
 

注具可参考:http://www.111cn.net/phper/php/42865.htm

时间: 2024-10-25 02:38:13

PHP数组传递给JavaScript以及json_encode的gbk中文乱码的解决的相关文章

如何将php数组或者对象传递给javascript

 这篇文章主要介绍了将php数组或者对象传递给javascript的方法,需要的朋友可以参考下 在网上搜了一些方法,最后自己采用的是通过json字串的方式.    假设有一个php 数组 $arr,代码如下:  代码如下: <script> // html5中默认的script是javascript,故不需要特别指定script language  var arr_js = <?php echo json_encode($arr)?>;  </script>     

PHP中的多行字符串传递给JavaScript的两种方法_php技巧

PHP和JavaScript都是初学.最近有这么个需求: 比方说有一个PHP的多行字符串: $a = <<<EOF thy38 csdn blog EOF; 传递给JavaScript后要等价于: var c='thy38\n\ csdn\n\ blog'; 因为对这两门语言的理解低到不知如何Google,只好自己摸索出方法两则: 1. 将PHP先转义,然后分割,然后转JSON,然后JavaScript parse,最后用\n拼接. var b=JSON.parse(<?php e

传值-如何将gridview的行号作为参数传递给javascript的函数?

问题描述 如何将gridview的行号作为参数传递给javascript的函数? gridview里面有一个label控件: Text='' CommandArgument='<%# Eval("F_GoodsID") %>' CommandName="Check" Font-Size="Small" ForeColor="#666666" Font-Underline="True" onmou

php json_encode实现与中文乱码解决方法

$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); echo json_encode($arr); //结果 //{"a":1,"b":2,"c":3,"d":4,"e":5} /* 下面看一款json_encode中文乱码问题 解决方法是用urlencode()函数处理以下,在json_encode之前,把所有数组内所有内容都

java socket 用数组缓冲循环读取xml数据随机个别中文乱码

问题描述 javasocket用数组缓冲循环读取xml数据随机个别中文乱码关键代码byte[]buf=newbyte[1024]while(...){len=in.read(-)stringbuilder.append(newstring(buf,0,len,"gb2312"))}注意,是最终结果随机个别中文乱码谢谢 解决方案 解决方案二:这样当然会随机乱码,直接以字符流读取就好了.如果你还是要用字节流读取的话,那你要一次性把所有的字节全部读取之后,然后再转成字符串就好了.乱码的原因是

把JS、vbs中的数组传递给COM组件Activex

COM组件的方法在IDL中的声明: [id(1), helpstring("方法InputArray")] HRESULT InputArray([in] VARIANT vData); 在脚本中建立数组并调用COM组件的方法: 当数组很大的时候,like 100k ,javascript在给数组赋值的时候效率非常低!完成时间,cpu占用率,占用的内存都大的可怕.反而VBScript却完成的很好. COM组件的代码: 从代码中可以看到vbscript传进来的是个SafeArray.而j

asp.net 地址栏url传中文乱码 的解决方法

1.设置web.config文件.   <system.web>    ......    <globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />    ......    </system.web>   或者: aspx文件中: &l

php中json_decode()和json_encode()用法与中文不显示解决办法

php中json_decode()和json_encode() 1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode - 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool $assoc ] ) 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 参数 json 待解码的 json string 格式的字符串. a

javascript中encodeURIComponent()函数URI中文乱码解决办法

问题描述 关于encodeURIComponent()函数应用之前在[注意javascript传递url数据的完整]一文有讨论,这里主要是讨论GBK编码的页面使用encodeURIComponent()函数编码URI通过ajax提交中文字符产生乱码的现象. 问题解决 使用encodeURIComponent()函数的目的是编码特殊字符 , / ? : @ & = + $ #,但实际应用中可能并不需要编码中文字符,因此可以编写自定义的函数替代encodeURIComponent()函数. 使 用e