对于以子弹为字符的字段,json_encode返回null

时间:2014-09-01 10:49:52

标签: php sql-server json linux

我有一个梦魇JSON编码来自MSSQL的数据库结果。它对所有字符进行编码,但任何带有诸如项目符号等字符的字段都会返回NULL

我已经搜索了其他类似的问题和答案,但没有一个对我有效,所以我在这里发帖

我已经在我的本地计算机(Windows)上进行了测试,它使用PDO。我已经在未来的生产服务器(Linux)上对它进行了测试,但它并没有。两个php版本都是5.4.9

无法升级/更改生产服务器的任何内容。

这是有问题的代码

<?php
ini_set('mssql.charset', 'UTF-8');

$server = 'XXXXXXX';

// Connect to MSSQL
$link = mssql_connect($server, 'XXXXXXXX', 'XXXXXXXX');

if (!$link) {
    die('Something went wrong while connecting to MSSQL');
}

mssql_select_db('XXXXXXX', $link);

$sql = "SELECT * FROM table WHERE view.[column] = 'XXXXXXX'";

$query = mssql_query($sql);

$rows = array();

while ($row = mssql_fetch_array($query, MSSQL_ASSOC)) {
    $rows[] = $row;
}

// Clean up
mssql_free_result($query);

$json = array();

foreach($rows as $row) {
    foreach($row as $key => $value) {
        $json[$key] = trim($value);
    }   
}

var_dump($rows);
exit;

echo json_encode($json);

1 个答案:

答案 0 :(得分:1)

显然,DB的输出不是UTF-8编码的。 According to the PHP docs,json_encode()的所有输入都必须是UTF-8。

示例:

$test = array('foo' => 'äöü', 'bar' => 'äöü');
$test['foo'] = mb_convert_encoding($test['foo'], 'ISO-8859-1', 'UTF-8');
echo json_encode($test);

结果:

{"foo":null,"bar":"\u00e4\u00f6\u00fc"}

解决方案:将数据库输出转换为UTF-8。