php json_decode中文换行,PHP中json_encode与json_decode出现换行回车中文为空错误的解决方法...

1、json_encode与json_decode的用法

json_encode — 对变量进行 JSON 编码

json_encode() 例子$arr = array ('aa'=>1,'bb'=>2,'cc'=>3,'dd'=>4,'ee'=>5);

echo json_encode($arr);

?>

以上例程会输出:{"aa":1,"bb":2,"cc":3,"dd":4,"ee":5}

json_decode — 对 JSON 格式的字符串进行解码

json_decode() 的例子<?php

$json = '{"aa":1,"bb":2,"cc":3,"dd":4,"ee":5}';

var_dump(json_decode($json));

var_dump(json_decode($json, true));

?>

以上例程会输出:object(stdClass)#1 (5) {

["aa"] => int(1)

["bb"] => int(2)

["cc"] => int(3)

["dd"] => int(4)

["ee"] => int(5)

}

array(5) {

["aa"] => int(1)

["bb"] => int(2)

["cc"] => int(3)

["dd"] => int(4)

["ee"] => int(5)

}json_decode($data,true)输出的一个关联数组,

json_decode($data)输出的是对象,而json_decode("$arr",true)是把它强制生成PHP关联数组.

2、json_encode与json_decode中存在换行时为空的注意事项

这种情况一般是json_encode序列化数组时出现错误,错误原因有很多,可以通过json_last_error函数来查看错误原因!!!

可能的原因

-----------------------------------------------------------

1、反斜杠,可以用stripslashes() 函数删除由 addslashes() 函数添加的反斜杠,可能还要用到urlencode ()— 编码 URL 字符串

-----------------------------------------------------------

json_last_error函数手册地址(http://www.php.net/manual/zh/function.json-last-error.php)

-----------------------------------------------------------

(PHP 5 >= 5.3.0, PHP 7)

json_last_error — 返回最后发生的错误

说明

-----------------------------------------------------------

int json_last_error ( void ) 如果有,返回 JSON 编码解码时最后发生的错误。

参数

-----------------------------------------------------------

此函数没有参数。

返回值

-----------------------------------------------------------

返回一个整型(integer),这个值会是以下的常量之一:JSON_ERROR_NONE没有错误发生

JSON_ERROR_DEPTH到达了最大堆栈深度

JSON_ERROR_STATE_MISMATCH无效或异常的 JSON

JSON_ERROR_CTRL_CHAR控制字符错误,可能是编码不对

JSON_ERROR_SYNTAX语法错误

JSON_ERROR_UTF8异常的 UTF-8 字符,也许是因为不正确的编码。PHP 5.3.3

JSON_ERROR_RECURSIONOne or more recursive references in the value to be encodedPHP 5.5.0

JSON_ERROR_INF_OR_NANOne or more NAN or INF values in the value to be encodedPHP 5.5.0

JSON_ERROR_UNSUPPORTED_TYPE指定的类型,值无法编码。PHP 5.5.0

JSON_ERROR_INVALID_PROPERTY_NAME指定的属性名无法编码。PHP 7.0.0

JSON_ERROR_UTF16畸形的 UTF-16 字符,可能因为字符编码不正确。PHP 7.0.0

echo json_encode(array('error' => '0', 'message' => '没有错误'));

var_dump(json_last_error());

//这里也可以是json_decode

//错误码对照

0 JSON_ERROR_NONE

1 JSON_ERROR_DEPTH

2 JSON_ERROR_STATE_MISMATCH

3 JSON_ERROR_CTRL_CHAR

4 JSON_ERROR_SYNTAX

5 JSON_ERROR_UTF8

6 JSON_ERROR_RECURSION

7 JSON_ERROR_INF_OR_NAN

8 JSON_ERROR_UNSUPPORTED_TYPE

说一下我的解决方案

首先保证接受的json数据格式正确,但是就是转换失败,大部分原因是因为json中含有一些空格、换行符号、或者一些额外的字符,这些字符正常打印是看不出来的,很烦!!

在json解码之前先把数据处理一下 urldecode(HTML_entity_decode($data));

由此分析我们给别人的json也要处理好,方法:htmlentities(urlencode(json_encode($data)));

从APP端或从其他页面post,get过来的数据一般因为数组形式。因为数组形式不易传输,所以一般都会转json后再发送。本以为发送方json_encode(),接收方json_decode(),就解决的问题,结果发现,json_decode()后是NULL。

一般会反应是少了一个参数“true”,但是回去看就是 json_decode($data,true); 那怎么还会是NULL呢?难道是编码,不会啊,接收后直接打印是一个完整json字符串的形式,在网上json解析网站,也是可以正常解析的。

那这是怎么回事呢? 其实是编码转译的问题。

用下面的方法可以实现正确解析。$data = stripslashes(html_entity_decode($info)); //$info是传递过来的json字符串

$data = json_decode($data,TRUE);

这时候$data就是解析后的数组了!

html_entity_decode() 函数的作用是把 HTML 实体转换为字符。

stripslashes() 函数的作用是删除反斜杠。

3、MySQL 存储php中json_encode格式中文问题及解决

原因分析:

在存储到数据库时!MySQL 不会存储 unicode 字符:

MySQL 仅支持从基本的多语种平面字符 (0x0000-0xFFFF)。请尝试存储一个同义词相反:)

更新: MySQL 5.5.3 上 (其中尚未 GA), 支持补充字符如果您使用 UTF8MB4 编码。

json_encode中文的时候,会把每个中文字符encode成“\uxxxx”

而存进数据库的时候,“\”被屏蔽了,直接变成”uxxxx”

解决问题:

知道是什么原因就好解决问题了,你可以选择其他存储方式;

或者再对症下药进一步转义"\"为“\\”,以保留"\"

我们的解决方案:

a. 避免json_encode将中文转换unicode编码.

PHP5.4版本,已经给Json新增了一个选项: JSON_UNESCAPED_UNICODE。加上这个选项后,就不会自动把中文编码了。$test = json_encode("深圳", JSON_UNESCAPED_UNICODE);

b. 先将中文字段urlencode,json_encode后,再用urldecode,也可以保证中文不会被转成unicode。$test =urldecode(json_encode(array('brief'=>urlencode('简介'),'title'=>urlencode(标题)));

c. 进一步转义"\"为“\\” 避免unicode中文前'\'被mysql当成特殊字符去除$test = addslashes(json_encode('中文'));

以上都可以直接插入mysql,问题解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值