您現在的位置: 365建站網 > 365學習 > PHP中json_encode與json_decode出現換行回車中文為空錯誤的解決方法

PHP中json_encode與json_decode出現換行回車中文為空錯誤的解決方法

文章來源:365jz.com     點擊數:499    更新時間:2021-03-13 17:26   參與評論

1、json_encode與json_decode的用法

json_encode — 對變量進行 JSON 編碼

 json_encode() 例子

<?PHP

$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,問題解決


如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇


發表評論 (499人查看,0條評論)
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼: 點擊我更換圖片
最新評論
------分隔線----------------------------
自拍偷拍福力视频,偷拍国际精品,麻豆一区福利电影,国产网红视频午夜福利,se视频大全,久久国产AV影院 高清一卡二卡三卡四卡免费| 潮喷失禁大喷水无码| free欧美高清猪马牛| 日韩精品无码一区二区三区在线| 男女性动态激烈动态图| 婷婷网色偷偷亚洲男人的天堂| 香蕉免费一区二区三区在| 成年动作片av在线观看| 日韩午夜无码精品试看| brazzershd欧美巨大| 诱人的女邻居2中文字幕| 色婷婷激婷婷深爱五月| 女人与公拘交的A片视频网站| 老司机深夜福利未满十八| 大胆女人| 120秒试看无码体验区| 人人妻人人澡人人爽欧美一区| 公不要添了下面流水啦| 将军请自重h| 日本丰满少妇裸体自慰艺术照| 啊 叫大点声 欠cao的sao货| 极品少妇的粉嫩小泬视频| 欧美zo9猪| 久久爱视频这里只有精品100| 国产三级视频在线播放线观看| 大胆顶级人休艺术| 我在洗碗他在下面弄我| 老富婆性需求按摩| 精品精品国产理论在线观看| 国产99视频精品免费视看9| 岳目录| http://www.megurosoko.com