搜尋
首頁後端開發php教程php用json_encode后中文显示null

PHP JSON null

有这一个数组:
Array(    [0] => Array        (            [name] => 192.168.1.250            [id] => 3232236026            [items] => Array                (                    [defualt] => Array                        (                            [parentNode] => 3232236026                            [name] => 请选择接口                            [id] => 0                        )                    [0] => Array                        (                            [parentNode] => 3232236026                            [name] => LAN0(内网)                            [id] => em0                        )                    [1] => Array                        (                            [parentNode] => 3232236026                            [name] => LAN1(外网)                            [id] => em1                        )                )        ))


我在解析前先用mb_convert_encoding()改了成了utf-8

我用json_encode解析后,在linux终端用php xxx.php直接执行,能得到正确的结果:
[{"name":"192.168.1.250","id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name":"\u8bf7\u9009\u62e9\u63a5\u53e3","id":"0"},"0":{"parentNode":"3232236026","name":"LAN0(\u5185\u7f51)","id":"em0"},"1":{"parentNode":"3232236026","name":"LAN1(\u5916\u7f51)","id":"em1"}}}]

但是我用火狐的web控制台打开后,得到的结果却是:
[{"name":"192.168.1.250","id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name":"\u8bf7\u9009\u62e9\u63a5\u53e3","id":"0"},"0":{"parentNode":"3232236026","name":null,"id":"em0"},"1":{"parentNode":"3232236026","name":null,"id":"em1"}}}]

上面的“请选择接口”这个字符串,是我在php中直接输入的,而“LAN1(外网)”是我在一个文件里面获取的,他们有什么不一样吗?该如何解决呢?

回复讨论(解决方案)

1、json_encode 只能处理 utf-8 的数据(可利用命名空间重定义)
2、你的php程序是 utf-8 的,所以“请选择接口”能通过编码
3、你的数据文件不是 utf-8 的,所以“LAN1(外网)”等,不能通过编码

解决的办法是:将数据文件以 utf-8 编码保存

回复1L, 

我编辑的环境都是gbk的,所以我直接在php编辑时输入“请选择接口”后,就用mb_convert_encoding()改成utf-8了,

“LAN1(外网)”也是一样的,从另外一个文件获取后,也用mb_convert_encoding()改成utf-8了。

所以我php xxx.php执行这个php文件能通过,得到正确的结果LAN1(\u5916\u7f51),就是在火狐的web控制台那里打开得到的结果是Null,

我百度了一下,有人说那个文件是用c生成的,里面带有\0,我替换了LAN1(外网)可能有的\0后,结果还是一样的。

你的程序里不是用类似这样的语句吗
$s = json_encode( $ar);

你在其后加上
echo base64_encode(serialize( $ar));
贴出结果

czoyODM6Ilt7Im5hbWUiOiIxOTIuMTY4LjEuMjUwIiwiaWQiOiIzMjMyMjM2MDI2IiwiaXRlbXMiOnsiZGVmdWFsdCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjAyNiIsIm5hbWUiOiJcdThiZjdcdTkwMDlcdTYyZTlcdTYzYTVcdTUzZTMiLCJpZCI6IjAifSwiMCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjAyNiIsIm5hbWUiOiJMQU4wKFx1NTE4NVx1N2Y1MSkiLCJpZCI6ImVtMCJ9LCIxIjp7InBhcmVudE5vZGUiOiIzMjMyMjM2MDI2IiwibmFtZSI6IkxBTjEoXHU1OTE2XHU3ZjUxKSIsImlkIjoiZW0xIn19fV0iOw==

[{"name":"192.168.1.250","id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name":"\u8bf7\u9009\u62e9\u63a5\u53e3","id":"0"},"0":{"parentNode":"3232236026","name":"LAN0(\u5185\u7f51)","id":"em0"},"1":{"parentNode":"3232236026","name":"LAN1(\u5916\u7f51)","id":"em1"}}}]

上面的是echo base64_encode(serialize($ar));
下面的是直接打印的结果。

让你贴出有问题的,你却贴出正常的


[root@localhost php]# php select_for_interface.php 
PHP Warning:  Directive 'register_globals' is deprecated in PHP 5.3 and greater in Unknown on line 0
czoyODM6Ilt7Im5hbWUiOiIxOTIuMTY4LjEuMjUwIiwiaWQiOiIzMjMyMjM2MDI2IiwiaXRlbXMiOnsiZGVmdWFsdCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjAyNiIsIm5hbWUiOiJcdThiZjdcdTkwMDlcdTYyZTlcdTYzYTVcdTUzZTMiLCJpZCI6IjAifSwiMCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjAyNiIsIm5hbWUiOiJMQU4wKFx1NTE4NVx1N2Y1MSkiLCJpZCI6ImVtMCJ9LCIxIjp7InBhcmVudE5vZGUiOiIzMjMyMjM2MDI2IiwibmFtZSI6IkxBTjEoXHU1OTE2XHU3ZjUxKSIsImlkIjoiZW0xIn19fV0iOw==
[{"name":"192.168.1.250","id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name":"\u8bf7\u9009\u62e9\u63a5\u53e3","id":"0"},"0":{"parentNode":"3232236026","name":"LAN0(\u5185\u7f51)","id":"em0"},"1":{"parentNode":"3232236026","name":"LAN1(\u5916\u7f51)","id":"em1"}}}]
[root@localhost php]#

上面是我的操作结果, 这个结果貌似是正常的,但是用浏览器打开后却是不正常的:
czoyNTE6Ilt7Im5hbWUiOiIxOTIuMTY4LjEuMjUwIiwiaWQiOiIzMjMyMjM2MDI2IiwiaXRlbXMiOnsiZGVmdWFsdCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjAyNiIsIm5hbWUiOiJcdThiZjdcdTkwMDlcdTYyZTlcdTYzYTVcdTUzZTMiLCJpZCI6IjAifSwiMCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjAyNiIsIm5hbWUiOm51bGwsImlkIjoiZW0wIn0sIjEiOnsicGFyZW50Tm9kZSI6IjMyMzIyMzYwMjYiLCJuYW1lIjpudWxsLCJpZCI6ImVtMSJ9fX1dIjs=
[{"name":"192.168.1.250","id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name":"\u8bf7\u9009\u62e9\u63a5\u53e3","id":"0"},"0":{"parentNode":"3232236026","name":null,"id":"em0"},"1":{"parentNode":"3232236026","name":null,"id":"em1"}}}]

这就是浏览器中记录的结果。

我要你给出的是 json_encode 之前的数据,好像我 #3 的描述不会产生歧义吧?




YToxOntpOjA7YTozOntzOjQ6Im5hbWUiO3M6MTM6IjE5Mi4xNjguMS4yNTAiO3M6MjoiaWQiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NToiaXRlbXMiO2E6Mzp7czo3OiJkZWZ1YWx0IjthOjM6e3M6MTA6InBhcmVudE5vZGUiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NDoibmFtZSI7czoxNToi6K+36YCJ5oup5o6l5Y+jIjtzOjI6ImlkIjtzOjE6IjAiO31pOjA7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjAo5YaF572RKSI7czoyOiJpZCI7czozOiJlbTAiO31pOjE7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjEo5aSW572RKSI7czoyOiJpZCI7czozOiJlbTEiO319fX0=

没看仔细。。。

URLencode一下在json吧然后在decode回来了不知行不行

[{"name":"192.168.1.250","id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name":"\u8bf7\u9009\u62e9\u63a5\u53e3","id":"0"},"0":{"parentNode":"3232236026","name":"LAN0(\u5185\u7f51)","id":"em0"},"1":{"parentNode":"3232236026","name":"LAN1(\u5916\u7f51)","id":"em1"}}}]
又是给了正确的数据




YToxOntpOjA7YTozOntzOjQ6Im5hbWUiO3M6MTM6IjE5Mi4xNjguMS4yNTAiO3M6MjoiaWQiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NToiaXRlbXMiO2E6Mzp7czo3OiJkZWZ1YWx0IjthOjM6e3M6MTA6InBhcmVudE5vZGUiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NDoibmFtZSI7czoxNToi6K+36YCJ5oup5o6l5Y+jIjtzOjI6ImlkIjtzOjE6IjAiO31pOjA7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjAo5YaF572RKSI7czoyOiJpZCI7czozOiJlbTAiO31pOjE7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjEo5aSW572RKSI7czoyOiJpZCI7czozOiJlbTEiO319fX0=

没看仔细。。。

回复10L,这个确实是json_encode()之前的数组的数据了。

另外,我测试了一下,就算从文件里面读取的全是英文,火狐web控制台也是得到的Null,
同时,我将内容写死在php代码里面,火狐web控制台得到的就是正确结果。

结论:貌似只要是从文件里面读取的,经过json_encode()后,火狐web控制台得到的就是null。

但是我在其他机器上也使用过从文件读取内容,通过json_encode()后在界面展示,没出现过这样的问题啊。

浏览器得到的只是 json_encode 执行后的结果,并且也不会去改变接受到的数据
所以如果是 null 那么一定是在 json_encode 时产生的

我要你提供的正是你发现有 null 时的原始数据,这样才能找到问题出现的原因
抗燃,如果你不愿意,我更无所谓

浏览器得到的只是 json_encode 执行后的结果,并且也不会去改变接受到的数据
所以如果是 null 那么一定是在 json_encode 时产生的

我要你提供的正是你发现有 null 时的原始数据,这样才能找到问题出现的原因
抗燃,如果你不愿意,我更无所谓
老大,这个地址的问题:http://bbs.csdn.net/topics/390507272
就算不解答,也烦请告诉下原因啊。

浏览器得到的只是 json_encode 执行后的结果,并且也不会去改变接受到的数据
所以如果是 null 那么一定是在 json_encode 时产生的

我要你提供的正是你发现有 null 时的原始数据,这样才能找到问题出现的原因
抗燃,如果你不愿意,我更无所谓

我8L发的那一段确实是我json_encode()之前的那个数组, 用print_r打印出来的就是我主楼贴的那个数组。
现象是终端打印结果是正常的, 火狐控制台看就异常了, 截图如下:

从图中可以看出来, php xxx.php执行后的结果,也就是echo出来的结果中带LAN1(\u5916\u7f51),


而在火狐控制台,火狐收到的结果却是null。

然后,我接下来做测试, 将读取文件的内容,不通过读取,直接写死到php代码中,


从这个截图可以看出,echo出来的内容,和上一楼基本是一样的


但是在火狐这里得到结果,却天差地别。这个结果是对的。

同时, 我读取文件里面去掉中文,全英文,得到的结果也是Null,感觉读取文件,火狐的显示Null,不读取就正常

不是有
=> 323236026 [name] => [id] => em0
这样的吗?
name 至少是不可见字符,那么怎么能正确转换呢?

你这是 ajax 应用吧?你可以还是火狐操作
但把 echo base64_encode(serialize($ar)); 改成
file_put_contents('test.txt', base64_encode(serialize($ar)));
然后贴出 test.txt 的内容

是的,ajax调用php,php通过echo返回一个json对象给ajax进行后续处理。

test.txt里面的内容:
YToxOntpOjA7YTozOntzOjQ6Im5hbWUiO3M6MTM6IjE5Mi4xNjguMS4yNTAiO3M6MjoiaWQiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NToiaXRlbXMiO2E6Mzp7czo3OiJkZWZ1YWx0IjthOjM6e3M6MTA6InBhcmVudE5vZGUiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NDoibmFtZSI7czoxNToi6K+36YCJ5oup5o6l5Y+jIjtzOjI6ImlkIjtzOjE6IjAiO31pOjA7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjAo5YaF572RKSI7czoyOiJpZCI7czozOiJlbTAiO31pOjE7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjEo5aSW572RKSI7czoyOiJpZCI7czozOiJlbTEiO319fX0=

这是火狐得到的内容:
YToxOntpOjA7YTozOntzOjQ6Im5hbWUiO3M6MTM6IjE5Mi4xNjguMS4yNTAiO3M6MjoiaWQiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NToiaXRlbXMiO2E6Mzp7czo3OiJkZWZ1YWx0IjthOjM6e3M6MTA6InBhcmVudE5vZGUiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NDoibmFtZSI7czoxNToi6K+36YCJ5oup5o6l5Y+jIjtzOjI6ImlkIjtzOjE6IjAiO31pOjA7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO047czoyOiJpZCI7czozOiJlbTAiO31pOjE7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO047czoyOiJpZCI7czozOiJlbTEiO319fX0=

file_put_contents('test.txt', base64_encode(serialize($arr_select)));
$json = json_encode($arr_select);
print_r($arr_select);
echo base64_encode(serialize($arr_select));
echo "\n";
echo $json;

我这样应该是打印出的版主要的内容了吧。

你说一下,你 #17 的两段数据是怎么来的?
都是经火狐请求而保存到文件里的吗?
如果是,那么为什么不一样?

你说一下,你 #17 的两段数据是怎么来的?
都是经火狐请求而保存到文件里的吗?
如果是,那么为什么不一样?

那两段数据, test.txt里面就是执行版主你的语句得到的, 同时也是echo base64_encode(serialize($arr_select));的结果。

而第二段数据,是火狐web控制台跟踪http请求,有火狐打印出来的响应的内容。

就是不知道为什么会不一样, 因为不管怎么改, php里面在Linux终端直接echo得到的确实是有LAN1(\u5916\u7f51),而火狐出现的确实Null, 这种情况我也是第一次遇到, 读文件,不管有没有中文,火狐打印的都是null, 

我换一台机器部署一下我的代码试试看, 看看是不是环境的原因。

我要你把
file_put_contents('test.txt', base64_encode(serialize($arr_select)));
放在你的程序里,然后用火狐按正常流程访问你的程序
这样得到的 test.txt,才是真实的数据

我要你把
file_put_contents('test.txt', base64_encode(serialize($arr_select)));
放在你的程序里,然后用火狐按正常流程访问你的程序
这样得到的 test.txt,才是真实的数据


不好意思啊,版主, 我换个环境试了下, 倒是没发现问题,后来看了你21楼的提示,发现是文件权限的原因,我直接在Linux终端直接执行,用的root权限,能够正常打印,但是在浏览器打印的时候,用的apche权限,权限不足,所以没有打开那个文件

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP與Python:了解差異PHP與Python:了解差異Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

php:死亡還是簡單地適應?php:死亡還是簡單地適應?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來:改編和創新PHP的未來:改編和創新Apr 11, 2025 am 12:01 AM

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

您什麼時候使用特質與PHP中的抽像類或接口?您什麼時候使用特質與PHP中的抽像類或接口?Apr 10, 2025 am 09:39 AM

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?Apr 10, 2025 am 09:38 AM

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。Apr 10, 2025 am 09:37 AM

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP如何安全地上載文件?PHP如何安全地上載文件?Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

什麼是無效的合併操作員(??)和無效分配運算符(?? =)?什麼是無效的合併操作員(??)和無效分配運算符(?? =)?Apr 10, 2025 am 09:33 AM

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能