使用PHP 5.2.17将从MySQL获取的PHP数组编码转换为JSON unicode

时间:2012-10-23 12:54:32

标签: php json character-encoding

我使用的是PHP 5.2.17服务器+ MySQL 5.1.65。

我有一个包含VARCHAR utf8_general_ci字段的表,我从该表中获取记录。

这是我打开连接的方式,没什么特别的:

$link = mysql_connect('localhost', 'user', 'pass');

我需要使用包含Unicode转义的特殊字符的JSON对象进行响应,我的意思是\u00e1表示法。

 $result = mysql_query(sprintf("select * from data t where t.domain='%s'", escape($domain));


  while($row = mysql_fetch_array($result)) {
    $r[] = array(
      "tagid" => $row['DATAID'],
      "name" => $row['NAME']
    );
   )

$encoded = json_encode($r);
header('Content-type: application/json');
exit($encoded);

我的问题是包含特殊字符(áé..)的字段在JSON响应中返回为null

在谷歌搜索了一段时间后,我发现PHP 5.2缺少json_encode参数,所以我需要手动unicode-escape名称字段。但我怎么能这样做?

5 个答案:

答案 0 :(得分:3)

json_encode()应该能够很好地处理UTF-8数据 - JSON只是UTF-8,因此PHP很难将这个特定功能视为UTF-8。

$array = array('key' => 'せ');

var_dump(json_encode($array)); // string(16) "{"key":"\u305b"}"

您的列排序规则可能是VARCHAR utf8_general_ci,但这并不意味着字符编码为UTF-8。您的表格应使用以下内容创建:

CREATE TABLE ... CHARACTER SET utf8

您应该将其作为第一个查询执行:

SET NAMES utf8

答案 1 :(得分:1)

您可以自己实施json_encode,这不应该是有问题的,或者检查其他人的代码,例如this one(如果您有必要,可以进行可选的调整)。

答案 2 :(得分:1)

实际上没有必要这样逃避。更有可能的是,您的输入数据实际上并不是有效的UTF-8。

更改表的排序规则可能无法解决此问题。你确定它有效吗?

另外:停止使用mysql_函数并使用PDO或mysqli。很久很久以前,不推荐使用mysql_函数。

答案 3 :(得分:0)

您可能还会发现base64_encode(ing)数据将使json_encode更可靠。在你的例子中: "标记

"tagid" => base64_encode($row['DATAID'])
...

然后你json_encode整个事情。当然你必须在另一端使用base64_decode。

答案 4 :(得分:0)

如果您(像我一样)陷入5.4 PHP之前的环境,则此方法适用于使用returnmysql(字符串)获取的带有拉丁字母的多行mysqli最初MySQL utf8):

$encoded = jsonEncode($r);
exit($encoded);
function jsonEncode($outputArray) {
    $outputMe = "[";
    $k = 0;
    foreach ($outputArray as $key => $valueArray) {
        if ($k) { 
            $outputMe.=","; 
        }
        $outputMe.="{";
        $l=0;
        foreach ($valueArray as $position => $value) {
            if ($l) { 
                $outputMe.=","; 
            }
            $outputMe .= '"'.$position.'":"'.$value.'"';
            $l++;
        }
        $outputMe .= "}";
        $k++;
    }
    $outputMe .= "]";
    return $outputMe;
}