0

我正在使用 PHP 5.2.17 服务器 + MySQL 5.1.65。

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

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

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

我需要使用包含特殊字符的 JSON 对象进行响应 Unicode 转义,我的意思是\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);

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

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

4

5 回答 5

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
于 2012-10-23T13:13:47.367 回答
1

您可以json_encode自己实现,这应该不会有问题,或者检查其他人的代码,例如这个(当您发现有必要时进行可选调整)。

于 2012-10-23T12:58:52.837 回答
1

实际上没有必要进行这种转义。更有可能的是,您的输入数据实际上不是有效的 UTF-8。

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

另外:停止使用 mysql_ 函数并使用 PDO 或 mysqli。mysql_ 函数在很久很久以前就被弃用了。

于 2012-10-23T13:13:57.903 回答
0

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

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

然后你 json_encode 整个事情。当然,您必须在另一端进行 base64_decode。

于 2014-12-22T19:36:23.187 回答
0

如果您(像我一样)受困于 5.4 之前的PHP环境,这适用于return使用mysqlor mysqli(string original MySQL utf8) 获取的带有拉丁重音的 multirow :

$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;
}
于 2020-01-19T23:27:12.220 回答