PHP json_encode() 函數詳解及中文亂碼問題

在 php 中使用 json_encode() 內置函數(php > 5.2)能夠使用得 php 中數據能夠與其它語言很好的傳遞而且使用它。javascript

這個函數的功能是將數值轉換成json數據存儲格式。php

?前端

1java

2數據庫

3json

4數組

5app

6函數

7網站

8

9

<?php

$arr = array

(

'Name'=>'希亞',

'Age'=>

);

$jsonencode = json_encode($arr);

echo $jsonencode;

?>

程序運行結果以下:

{"Name":null,"Age":}

json_encode 函數中中文被編碼成 null 了,Google 了一下,很簡單,爲了與前端緊密結合,Json 只支持 utf- 編碼,我認爲是前端的 Javascript 也是 utf- 的緣由。

?

1

2

3

4

5

6

7

8

<?php

$array = array

(

'title'=>iconv('gb','utf-','這裏是中文標題'),

'body'=>'abcd...'

);

echo json_encode($array);

?>

這個程序的運行結果爲:

{"title":"\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898","body":"abcd..."}

數組中全部中文在json_encode以後都不見了或者出現\u2353等。

解決方法是用urlencode()函數處理如下,在json_encode以前,把全部數組內全部內容都用urlencode()處理一下,然用json_encode()轉換成json字符串,最後再用urldecode()將編碼過的中文轉回來。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<?php

/**************************************************************

*

* 使用特定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)

{

static $recursive_counter = ;

if (++$recursive_counter > ) {

die('possible deep recursion attack');

}

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]);

}

}

}

$recursive_counter--;

}

/**************************************************************

*

* 將數組轉換爲JSON字符串(兼容中文)

* @param array $array 要轉換的數組

* @return string 轉換獲得的json字符串

* @access public

*

*************************************************************/

function JSON($array) {

arrayRecursive($array, 'urlencode', true);

$json = json_encode($array);

return urldecode($json);

}

$array = array

(

'Name'=>'希亞',

'Age'=>

);

echo JSON($array);

?>

此次成功了,運行結果以下:

{"Name":"希亞","Age":"20"}

下面給你們介紹PHP json_encode中文亂碼解決方法

相信不少人在使用Ajax與後臺php頁面進行交互的時候都碰到過中文亂碼的問題。JSON做爲一種輕量級的數據交換格式,備受親睞,可是用PHP做爲後臺交互,容易出現中文亂碼的問題。JSON和js同樣,對於客戶端的字符都是以UTF8的形式進行處理的,也就是說,使用JSON做爲提交和接收的數據格式時字符都採用UTF8編碼處理,當咱們的頁面編碼和數據庫編碼不是採用UTF8的時候,就極容易出現中文亂碼的問題。解決辦法天然是在用js或者PHP處理JSON數據的時候都採用UTF8的形式

PHP5.2或以上的版本把json_encode做爲內置函數來用,給網站製做者帶來了很大的方便,可是咱們必須注意到json_encode只支持UTF8編碼的字符,不然,中文亂碼或者空值就出現了。

解決辦法分爲如下兩個步驟。

Step1

保證在使用JSON處理的時候字符是以UTF8編碼的。具體咱們能夠把數據庫編碼和頁面編碼都改成UTF8。固然喜歡用gbk編碼的話,能夠在進行JSON處理前,把字符轉爲UTF8形式。在PHP中有以下方法:

?

1

2

3

4

5

6

7

<?php

$data="JSON中文";

$newData=iconv("GB2312","UTF-8//IGNORE",$data);

echo $newData;

//ignore的意思是忽略轉換時的錯誤,若是沒有ignore參數,全部該字符後面的字符都不會被保存。

//或是("GB2312","UTF-8",$data);

?>

Step2

後臺PHP頁面(頁面編碼爲UTF-8或者已經把字符轉爲UTF-8)使用json_encode將PHP中的array數組轉爲JSON字符串。例如:

?

1

2

3

4

<?php

$testJSON=array('name'=>'中文字符串','value'=>'test');

echo json_encode($testJSON);

?>

查看輸出結果爲:

{「name」:」\u4e2d\u6587\u5b57\u7b26\u4e32″,」value」:」test」}

可見即便用UTF8編碼的字符,使用json_encode也出現了中文亂碼。解決辦法是在使用json_encode以前把字符用函數urlencode()處理一下,而後再json_encode,輸出結果的時候在用函數urldecode()轉回來。具體以下:

?

1

2

3

4

5

6

7

8

<?php

$testJSON=array('name'=>'中文字符串','value'=>'test');

//echo json_encode($testJSON);

foreach ( $testJSON as $key => $value ) {

$testJSON[$key] = urlencode ( $value );

}

echo urldecode ( json_encode ( $testJSON ) );

?>

查看輸出結果爲:

{「name」:」中文字符串」,」value」:」test」}

到此,成功地輸出了中文字符。隨意使用json_encode吧。這樣子在PHP後臺輸出的JSON字符串在前臺javascript中Ajax接收後eval出來也不會出現中文亂碼,由於js在處理JSON格式數據是也是以UTF8的形式進行的,與PHP相似,故接收PHP頁面的JSON字符串不會出現問題。

相關文章
相關標籤/搜索