今天使用json_encode函數(shù),發(fā)現(xiàn)中文竟成了null。
原因分析:使用json_encode函數(shù)應(yīng)應(yīng)使用utf-8編碼,我的頁面用的是gbk.
解決:在json_encode函數(shù)前使用iconv('gbk','utf8')函數(shù)。函數(shù)
1
2
3
4
5
6
7
8
|
function gbk2utf8( $data ) { if ( is_array ( $data )) { return array_map ( 'gbk2utf8' , $data ); } return iconv( 'gbk' , 'utf-8' , $data ); } |
//以下是找的另一種方法
PHP從數(shù)據(jù)庫中得到的字段是中文,想用json_encode()后返回給前臺(tái),可是json_encode對(duì)中文編碼后為null。
在 php 中使用 json_encode() 內(nèi)置函數(shù)(php > 5.2)可以使用得 php 中數(shù)據(jù)可以與其它語言很好的傳遞并且使用它。
這個(gè)函數(shù)的功能是將數(shù)值轉(zhuǎn)換成json數(shù)據(jù)存儲(chǔ)格式。
1
2
3
4
5
6
7
8
9
10
|
<?php $arr = array ( 'Name' => '希亞' , 'Age' =>20 ); $jsonencode = json_encode( $arr ); echo $jsonencode ; ?> |
程序運(yùn)行結(jié)果如下:
{"Name":null,"Age":20}
json_encode 函數(shù)中中文被編碼成 null 了,Google 了一下,很簡(jiǎn)單,為了與前端緊密結(jié)合,Json 只支持 utf-8 編碼,我認(rèn)為是前端的 Javascript 也是 utf-8 的原因。
1
2
3
4
5
6
7
8
9
|
<?php $array = array ( 'title' =>iconv( 'gb2312' , 'utf-8' , '這里是中文標(biāo)題' ), 'body' => 'abcd...' ); echo json_encode( $array ); ?> |
這個(gè)程序的運(yùn)行結(jié)果為:
{"title":"\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898","body":"abcd..."}
數(shù)組中所有中文在json_encode之后都不見了或者出現(xiàn)\u2353等。
解決方法是用urlencode()函數(shù)處理以下,在json_encode之前,把所有數(shù)組內(nèi)所有內(nèi)容都用urlencode()處理一下,然用json_encode()轉(zhuǎn)換成json字符串,最后再用urldecode()將編碼過的中文轉(zhuǎn)回來。
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
53
54
55
56
57
|
<?php /************************************************************** * * 使用特定function對(duì)數(shù)組中所有元素做處理 * @param string &$array 要處理的字符串 * @param string $function 要執(zhí)行的函數(shù) * @return boolean $apply_to_keys_also 是否也應(yīng)用到key上 * @access public * *************************************************************/ function arrayRecursive(& $array , $function , $apply_to_keys_also = false) { static $recursive_counter = 0; if (++ $recursive_counter > 1000) { 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 --; } /************************************************************** * * 將數(shù)組轉(zhuǎn)換為JSON字符串(兼容中文) * @param array $array 要轉(zhuǎn)換的數(shù)組 * @return string 轉(zhuǎn)換得到的json字符串 * @access public * *************************************************************/ function JSON( $array ) { arrayRecursive( $array , 'urlencode' , true); $json = json_encode( $array ); return urldecode( $json ); } $array = array ( 'Name' => '希亞' , 'Age' =>20 ); echo JSON( $array ); ?> |
這次成功了,運(yùn)行結(jié)果如下:
{"Name":"希亞","Age":"20"}