我使用的是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名称字段。但我怎么能这样做?
答案 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
之前的环境,则此方法适用于使用return
或mysql
(字符串)获取的带有拉丁字母的多行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;
}