用户
 找回密码
 入住 CI 中国社区
搜索
查看: 13740|回复: 7
收起左侧

PHP 生成 JSON数据集 并解决中文乱码问题

[复制链接]
发表于 2011-8-3 00:16:00 | 显示全部楼层 |阅读模式
PHP复制代码
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
//建立数据库连接
//$con = mysql_connect ( "localhost", "name", "yourpwd" );
if (! $con) {
    die ( 'Could not connect: ' . mysql_error () );
}
//选择查询的数据库
mysql_select_db ( "china_city", $con );
//设置字符集为UTF-8
mysql_query ( "set names utf8" );
$query = "select * from provincial";
//执行SQL语句
$result = mysql_query ( $query );
//循环 将查询的数据存入数组
while ( $row = mysql_fetch_assoc ( $result ) ) {
    $response [] = $row;
}
//使用Foreach遍历数组 同时使用urlencode处理 含有中文的字段
foreach ( $response as $key => $value ) {
    $newData[$key] = $value;
    $newData [$key] ['Provincial'] = urlencode ( $value ['Provincial'] );
}
echo urldecode ( json_encode ( $newData ) );
mysql_close ( $con );
?>
复制代码


最终JSON数据如下
[{"pid":"1","Provincial":"北京市"},{"pid":"2","Provincial":"天津市"},{"pid":"3","Provincial":"上海市"},
{"pid":"4","Provincial":"重庆市"},{"pid":"5","Provincial":"河北省"},{"pid":"6","Provincial":"山西省"},
{"pid":"7","Provincial":"台湾省"},{"pid":"8","Provincial":"辽宁省"},{"pid":"9","Provincial":"吉林省"},
{"pid":"10","Provincial":"黑龙江省"},{"pid":"11","Provincial":"江苏省"},{"pid":"12","Provincial":"浙江省"},{"pid":"13","Provincial":"安徽省"},{"pid":"14","Provincial":"福建省"},{"pid":"15","Provincial":"江西省"},{"pid":"16","Provincial":"山东省"},{"pid":"17","Provincial":"河南省"},{"pid":"18","Provincial":"湖北省"},{"pid":"19","Provincial":"湖南省"},{"pid":"20","Provincial":"广东省"},{"pid":"21","Provincial":"甘肃省"},{"pid":"22","Provincial":"四川省"},{"pid":"23","Provincial":"贵州省"},{"pid":"24","Provincial":"海南省"},{"pid":"25","Provincial":"云南省"},{"pid":"26","Provincial":"青海省"},{"pid":"27","Provincial":"陕西省"},{"pid":"28","Provincial":"广西壮族自治区"},{"pid":"29","Provincial":"西藏自治区"},
{"pid":"30","Provincial":"宁夏回族自治区"},{"pid":"31","Provincial":"新疆维吾尔自治区"},
{"pid":"32","Provincial":"内蒙古自治区"},{"pid":"33","Provincial":"澳门特别行政区"},
{"pid":"34","Provincial":"香港特别行政区"}]

评分

参与人数 1威望 +4 收起 理由
IT不倒翁 + 4 很好,只是这是原生 PHP ,和 CI 关系不大.

查看全部评分

发表于 2011-8-3 10:16:31 | 显示全部楼层
本帖最后由 yuzhigang5460 于 2011-8-3 10:34 编辑

如果是ajax,直接 echo json_encode($response); //这里输出的中文是乱码
在客户端,$.post('url.php', {'data': 'mydata'}, function(data){
data = eval('(' + data +')');
alert(data[0].Provincial);
})
弹出的不会是乱码的。
如果觉得eval函数不安全,可以使用$.getJSON( );,如果选择了jquery库的话。

还有,使用楼主这种方法要注意的一点是,如果数据源还有特殊符号,比如",\,客户端使用eval解析会出现问题。

以上知识是在自己的项目中总结的,可能有些片面,有知情者可以试试。

发表于 2012-8-3 10:11:48 | 显示全部楼层
json_encode()输出的是标准的json对象,那个不叫乱码,好吧?
发表于 2012-8-22 15:33:51 | 显示全部楼层
楼上说的对,根本没必要写这些代码,无用功。
echo json_encode($var);
输出的是标准的json字符串,中文本来就是被转换过的,不是什么乱码。
发表于 2012-10-4 11:32:11 | 显示全部楼层
如果客户端是用js写,确实像楼上两位说的没什么必要。但是我最近在用java的intent链接一个php的url返回数据,一直是转化后的编码,java客户端也没找到解决办法,楼主的方法很管用,谢谢~
发表于 2013-6-12 08:13:53 | 显示全部楼层
levin 发表于 2012-8-22 15:33
楼上说的对,根本没必要写这些代码,无用功。
echo json_encode($var);
输出的是标准的json字符串,中文本 ...

如果项目编码不是utf8,直接使用json_encode转换出来的中文会变成NULL的,urlencode后就不存在这个问题了
发表于 2013-8-13 19:17:10 | 显示全部楼层
lllccc 发表于 2013-6-12 08:13
如果项目编码不是utf8,直接使用json_encode转换出来的中文会变成NULL的,urlencode后就不存在这个问题了 ...

生成json字符串的时候只能使用utf-8。
不过可以用下面这个函数先实现utf8数组转码然后在直接使用json_encode():
function output($arr = array()) {    return eval('return ' . iconv('GB2312', 'UTF-8', var_export($arr, true)) . ';');}
发表于 2016-5-24 13:36:35 | 显示全部楼层
urlencode最方便

本版积分规则