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

 更新时间:2016年11月25日 17:39  
本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode()
1.json_decode(
本文章介绍了关于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 格式的字符串。

assoc
当该参数为 TRUE 时,将返回 array 而非 object 。


返回值
Returns an object or if the optional assoc parameter is TRUE, an associative array is instead returned.

范例

Example #1 json_decode() 的例子

 代码如下 复制代码

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>

上例将输出:

object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}


$data='[{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""}]';
echo json_decode($data);

结果为:

Array ( [0] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [1] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [2] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) )

可以看出经过json_decode()编译出来的是对象,现在输出json_decode($data,true)试下

 代码如下 复制代码

echo json_decode($data,true);

结果:

Array ( [0] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [1] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [2] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) )

可以看出 json_decode($data,true)输出的一个关联数组,由此可知json_decode($data)输出的是对象,而json_decode("$arr",true)是把它强制生成PHP关联数组.

2.json_encode()

json_encode
(PHP 5 >= 5.2.0, PECL json >= 1.2.0)

json_encode — 对变量进行 JSON 编码

Report a bug 说明
string json_encode ( mixed $value [, int $options = 0 ] )
返回 value 值的 JSON 形式

Report a bug 参数

value
待编码的 value ,除了resource 类型之外,可以为任何数据类型

该函数只能接受 UTF-8 编码的数据

options
由以下常量组成的二进制掩码: JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE.

Report a bug 返回值
编码成功则返回一个以 JSON 形式表示的 string 或者在失败时返回 FALSE 。

Report a bug 更新日志
版本 说明
5.4.0 options 参数增加常量: JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, 和 JSON_UNESCAPED_UNICODE。
5.3.3 options 参数增加常量:JSON_NUMERIC_CHECK。
5.3.0 增加 options 参数.


Report a bug 范例

Example #1 A json_encode() 的例子

 代码如下 复制代码

<?php
$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}

Example #2 json_encode() 函数中 options 参数的用法

<?php
$a = array('<foo>',"'bar'",'"baz"','&blong&', "xc3xa9");

echo "Normal: ", json_encode($a), "n";
echo "Tags: ", json_encode($a, JSON_HEX_TAG), "n";
echo "Apos: ", json_encode($a, JSON_HEX_APOS), "n";
echo "Quot: ", json_encode($a, JSON_HEX_QUOT), "n";
echo "Amp: ", json_encode($a, JSON_HEX_AMP), "n";
echo "Unicode: ", json_encode($a, JSON_UNESCAPED_UNICODE), "n";
echo "All: ", json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "nn";

$b = array();

echo "Empty array output as array: ", json_encode($b), "n";
echo "Empty array output as object: ", json_encode($b, JSON_FORCE_OBJECT), "nn";

$c = array(array(1,2,3));

echo "Non-associative array output as array: ", json_encode($c), "n";
echo "Non-associative array output as object: ", json_encode($c, JSON_FORCE_OBJECT), "nn";

$d = array('foo' => 'bar', 'baz' => 'long');

echo "Associative array always output as object: ", json_encode($d), "n";
echo "Associative array always output as object: ", json_encode($d, JSON_FORCE_OBJECT), "nn";
?>

以上例程会输出:

Normal: ["<foo>","'bar'",""baz"","&blong&","u00e9"]
Tags: ["u003Cfoou003E","'bar'",""baz"","&blong&","u00e9"]
Apos: ["<foo>","u0027baru0027",""baz"","&blong&","u00e9"]
Quot: ["<foo>","'bar'","u0022bazu0022","&blong&","u00e9"]
Amp: ["<foo>","'bar'",""baz"","u0026blongu0026","u00e9"]
Unicode: ["<foo>","'bar'",""baz"","&blong&","é"]
All: ["u003Cfoou003E","u0027baru0027","u0022bazu0022","u0026blongu0026","é"]

Empty array output as array: []
Empty array output as object: {}

Non-associative array output as array: [[1,2,3]]
Non-associative array output as object: {"0":{"0":1,"1":2,"2":3}}

Associative array always output as object: {"foo":"bar","baz":"long"}
Associative array always output as object: {"foo":"bar","baz":"long"}

Example #3 连续与非连续数组示例

 代码如下 复制代码

<?php
echo "连续数组".PHP_EOL;
$sequential = array("foo", "bar", "baz", "blong");
var_dump(
$sequential,
json_encode($sequential)
);

echo PHP_EOL."非连续数组".PHP_EOL;
$nonsequential = array(1=>"foo", 2=>"bar", 3=>"baz", 4=>"blong");
var_dump(
$nonsequential,
json_encode($nonsequential)
);

echo PHP_EOL."删除一个连续数组值的方式产生的非连续数组".PHP_EOL;
unset($sequential[1]);
var_dump(
$sequential,
json_encode($sequential)
);
?>

以上例程会输出:

 代码如下 复制代码

连续数组
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(3) "baz"
[3]=>
string(5) "blong"
}
string(27) "["foo","bar","baz","blong"]"

非连续数组
array(4) {
[1]=>
string(3) "foo"
[2]=>
string(3) "bar"
[3]=>
string(3) "baz"
[4]=>
string(5) "blong"
}
string(43) "{"1":"foo","2":"bar","3":"baz","4":"blong"}"

删除一个连续数组值的方式产生的非连续数组
array(3) {
[0]=>
string(3) "foo"
[2]=>
string(3) "baz"
[3]=>
string(5) "blong"
}
string(33) "{"0":"foo","2":"baz","3":"blong"}"


$obj->Name= 'a1';$obj->Number ='123';
$obj->Contno= '000';
echo json_encode($obj);

结果为:

{"Name":"a1",
"Number":"123",
"Contno":"000"
}

可以看出json_encode()和json_decode()是编译和反编译过程,注意json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null


如果是中文的话就要注意了

在网上找到一种解决方法:

 代码如下 复制代码

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


 

今天 在开发时碰到了关于Parse error: syntax error, unexpected $end 错误 提示,根据自己 的要验这里可能是 if else未成对出现,下面我们来总结一下问题和解决办法。

也许是不熟悉的php的一些特性吧,不过写多了,也就慢慢适应将就了.....

这里就整理一个代码编写调试问题,错误如下:

Parse error: syntax error, unexpected $end in D:xampphtdocsguestBookguestBook.php on line 330

看看程序 330行,代码最后一行,这有什么错误?google搜,找到了:

In PHP 5, the following error may appears as an error entry in Apache error log or simply displays on PHP web page, even if calling to php scripts with php_info() works perfectly and successfully returns information on PHP configurations:

Parse Error: syntax error, unexpected $end in ….. scripts.php on line …

The error may caused by a missing curly bracket in PHP script coding. Beside, it may also caused by error in PHP coding in class definition, as in PHP, a class definition cannot be broke up and distributed into multiple files, or into multiple PHP blocks, unless the break is within a method declaration.

But more commonly, the error is often caused by the use of Short Open tags in PHP,

To use short open tags, it must be enabled in PHP.INI. Search for short_open_tag in PHP.INI, and change the value to On. The line should look line:

short_open_tag = On

欺我英文不好啊?看看其它几条搜索,都没说到点子上,那就看看英文了,虽不能如数翻译,大致意思是瞧明白了:

错误发生是使用了短标签,可以在php.ini中设置short_open_tag = On

原来Parse error 提示一般是 语法错误,使用了开放的标签,语句没有结束 也就是编程基本的一些错, 比如没注意 语句结束加 ";" 或者 if(){...} 后面忘了"}" ;<?php...?>忘了"?>"。仔细检查代码,果然是一处漏掉了"}",修改程序正常运行

实例


conn.php
<?php

/*
 * PHP100Job v1.0
 * Programmer : Msn/QQ [email protected] (925939)
 * www.php100.com Develop a project PHP - MySQL - Apache
 * Window 2003 - Preferences - PHPeclipse - PHP - Code Templates
 */

$conn = @ mysql_connect("localhost", "root", "dong") or die("数据库链接错误");
mysql_select_db("news", $conn);
mysql_query("set names 'GBK'"); //使用GBK中文编码;

function htmtocode($content) {
$content = str_replace("n", "<br>", str_replace(" ", "&nbsp;", $content));
return $content;
}

//$content=str_replace("'","‘",$content);
 //htmlspecialchars();
 

?>

<?php

/*
 * PHP100Job v1.0
 * Programmer : Msn/QQ [email protected] (925939)
 * www.php100.com Develop a project PHP - MySQL - Apache
 * Window 2003 - Preferences - PHPeclipse - PHP - Code Templates
 */
 include("conn.php");

 include("head.php");
  $SQL="SELECT * FROM `message` order by id desc";
  $query=mysql_query($SQL);
  while($row=mysql_fetch_array($query)){
?>

<table width=500 border="0" cellpadding="5" cellspacing="1" bgcolor="#add3ef">
  <tr bgcolor="#eff3ff">
  <td>标题:<?=$row[title]?> 用户:<?=$row[user]?></td>
  </tr>
  <tr bgColor="#ffffff">
  <td>内容:<?
 echo htmtocode($row[content]);
  ?></td>
  </tr>
</table>
<?
  }
?>
运行出现下边的错误
Parse error: syntax error, unexpected $end in E:wampwwwleave_messagelist.php on line 35

报错的原因在这里
<?
  }
?>
改成
<?php
  }
?>

解决 办法

你把标题、内容,用户那三个改成<?php echo $row['title'];?>这样的就行了啊。函数就<?php echo htmtocode($row[content]); ?>

这不是主要的,至多只是显示不出数据
报错的原因在这里
<?
}
?>
改成
<?php
}
?>

本文章详细的介绍了session普通的后台管理登录以及利用session id 实现多台服务器之间的用户共享登录的方法,有需要了解的朋友可查看一下全文章。

我们先来讲述一下利用session来登录

登录页面05.php的代码如下:

 代码如下 复制代码
<?php  session_start() ;                    //初始化session
if (isset ($_SESSION['shili'])){
header ("Location:shili.php") ;     //重新定向到其他页面
exit ; }  ?>
<script language="javascript">
function checklogin (){
if ((login.username.value!="") && (login.password.value!=""))
return true                    //判断用户名和密码不为空,返回TRUE
else{ alert ("昵称或密码不能为空!") } }
</script>
<style type="text/css">
.style1 { font-size: 13px;  font-family: "黑体";  font-weight: normal;   color: #0099FF; }
</style>
<div align="center">
<table width="260" border="1" bgcolor="#D8EFFA">
<form name="login" method="post" action="06.php" onSubmit="return checklogin()">
<tr align="center">
<td height="30" colspan="2"><span class="style1">管理系统登录</span></td>
</tr>
<tr>
<td width="90" align="center" class="style1">管理员: </td>
<td width="170" height="20" align="left" valign="middle"><input name="username" type="text" id="username" size="20"></td>
</tr>
<tr>
<td align="center" class="style1">密码: </td>
<td height="20" align="left" valign="middle"><input name="password" type="password" id="password" size="20"></td>
</tr>
<tr>
<td align="center" class="style1">&nbsp ; </td>
<td height="20" align="center"><input type="submit" name="Submit" value="登 录"></td>
</tr>
</form>
</table>
</div>

该程序是一个管理员登录界面,首先初始化session,然后通过检测session变量是否已经注册来检测用户是否已经登录过,如果登录过,则无需再次登录,直接定向到其他页面。这里还使用了javascript来判断是否输入了用户名和密码。
验证登录的页面

06.php的代码如下:

 代码如下 复制代码
<?php  session_start () ;                   //初始session
if (isset ($_SESSION['shili'])){
header ("Location:shili.php") ;    //重新定向到其他页面
exit ; }                       //登录过的话立即结束
$shili_name=$_POST['username'] ;    //获取参数
$password=$_POST['password'] ;
//验证管理员名称和密码是否正确,这里采用直接验证,没有连接数据库
if ($shili_name=="mr" and $password=="mrsoft"){
session_register ("shili") ;        //注册新的变量,保存当前会话的昵称
$shili = $shili_name ;
echo "<font color=red>登录成功!</font>" ;
header ("Location:shili.php") ;    //登录成功重定向到管理页面
}else{
echo "<table width='100%' align=center><tr><td align=center>" ;
echo "账号或密码错误,或者不是管理员账号<br>" ;
echo "<font color=red>登录失败!</font><br><a href='http://wyl072.blog.163.com/blog/05.php'>请重新输入</a>";
echo "</td></tr></table>" ; }  
?>


该程序同样是先通过session变量检测用户是否已经登录,如果没有,则要对输入的用户名和密码进行验证,正确则注册session变量,输出登录成功!。如不正确,则提示登录失败。
这是一个简单的用户登录验证的程序,通过session变量阻止了那些没有登录而直接浏览的用户。如果想要对某个页面限制浏览的用户,可以使用同样的方式,只要把如下的代码放在该页面的开头即可:

 代码如下 复制代码

<?php  session_start () ;
if (!isset ($_SESSION['shili'])){
echo "<p align=center>" ;
echo "<font color=#ff0000 size=5><strong><big>" ;
echo "你没有登录,请<a href='http://wyl072.blog.163.com/blog/denglu.php'>登录</a>!" ;
echo "</big></strong></font></p>" ;
exit () ;  } 
?>


利用session_id实现共享登录

先,多服务器共享session问题,这个大家应该都能够理解的,当一个网站的用户量过大,就会使用服务器集群,例如专门有一个登录用的服务器。用户通过登录服务器登录之后,登录服务器保存了用户的登录信息session,而其他受访问的服务器,例如电影服务器没有这个session,那么我们就要通过一个session的唯一标识来共享这个session了——具体session的共享超出了本文的范围,请自行查阅资料。

第二个用途就是,验证同一用户的不同会话,这个比较难理解。这样说吧,一个用户并非通过浏览器来请求连接,而是通过socket或者其它方式来请求数据的时候,我们首先要对他进行用户登录验证,验证成功之后,就下发一个sessionid给他,然后他每次请求的时候就携带这个sessionid,我们通过这个sessionid来判断session是否已经存在,如果存在我们就认定用户已经登录……

对于第一个问题,我们可以把sessionid保存在数据库中得以实现,这个方法比较安全而且应用广泛,但是不是我们讨论的范围哦

首先验证的时候产生一个sessionid;

 代码如下 复制代码

<?php
Session_start();
$sessionId = session_id();//得到sessionid
//将session下发给客户端
.........
?>

客户端携带sessionid这个变量来请求数据

 代码如下 复制代码

<?php
Session_id(‘$sessionid');//注意这个时候session_id()这个函数是带有参数的
Session_start();//这个函数必须在session_id()之后
?>

好了不问题己得到了很好的解决有需要了解的朋友可以参考一下。

文章分享一篇关于php中fgetcsv windows和linux兼容问题,有碰到想同问题的同学可以参考一下下。

设置区域:简体中文,UTF-8编码

 代码如下 复制代码

setlocale(LC_ALL, 'zh_CN.UTF-8');

这句是在php开发中会碰的一些问题,看这提示我们都知道是变量未定义,那么下面来解决Notice:undefined index方法,

一,这个因为是变量未定义我们只要找到相关的位置加上

 代码如下 复制代码

function _get($str){
$val = !empty($_GET[$str]) ? $_GET[$str] : null;
return $val;
}

isset($_GET['你的变量'])?$_GET['你的变量']:'';

上面我们只举了get的用法还有post也一样,只要把上面的get改成post.


还有一种程序的全局定义方法

 代码如下 复制代码

if (!$cfg['debug']) {
 error_reporting(0);
 ob_start('ob_gzhandler');
} else {
 error_reporting(E_ALL ^ E_NOTICE);
}

这样我们只要对变量debug进行设置0或1对错误提示进行开关了


其它网页提供的方法


方法1:服务器配置修改

修改php.ini配置文件,error_reporting = E_ALL & ~E_NOTICE

方法2:在出现notice代码之前加上@,@表示这行有错误或是警告不要输出,@$username=$_post['username'];


注:如果你是利用了全局定义或在修改php.ini配置文件这样所有错误提示都不会出,这样对于开发测试来讲是相当的麻烦的,建义利用程序的方法,关闭错误提示最在在服务器上设置。

解决办法json_encode不显示