从PHP创建JSON提供错误的数据?

时间:2015-09-24 14:44:51

标签: php mysql json encoding utf-8

我有一个php表单用于输入数据到数据库(phpmyadmin),我用SELECT查询显示数据库中的所有值,以php格式查看。

我还有另一个PHP文件,我用它来从同一个db表创建JSON。

在这里,当我输入“Experienţalonală:”之类的外语时,在DB中保存的值是“ExperienÈ> apersonală:”但是当我使用select query以相同的php形式显示它时,它会正确显示“Experienţalronală:” 。所以db是正确的,现在使用以下php代码来创建JSON

    <?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "aaps";

// Create connection
$con=mysqli_connect($servername,$username,$password,$dbname);
// Check connection
mysqli_set_charset($con, 'utf8');
//echo "connected";
$rslt=mysqli_query($con,"SELECT * FROM offers");
while($row=mysqli_fetch_assoc($rslt))
{

$taxi[] = array('code'=> $row["code"], 'name'=> $row["name"],'contact'=> $row["contact"], 'url'=> $row["url"], 'details'=> $row["details"]);
}
header("Content-type: application/json; charset=utf-8");

echo json_encode($taxi);
?>

和JSON看起来像

[{"code":"CT1","name":"Experien\u00c8\u203aa personal\u00c4\u0192: ","contact":"4535623643","url":"images\/offers\/event-logo-8.jpg","details":"Experien\u00c8\u203aa personal\u00c4\u0192:  jerhbehwgrh  234234 hjfhjerg#$%$#%#4"},{"code":"ewrw","name":"Experien\u00c8\u203aa personal\u00c4\u0192: ","contact":"ewfew","url":"","details":"eExperien\u00c8\u203aa personal\u00c4\u0192: Experien\u00c8\u203aa personal\u00c4\u0192: Experien\u00c8\u203aa personal\u00c4\u0192: "},{"code":"Experien\u00c8\u203aa personal\u00c4\u0192: ","name":"Experien\u00c8\u203aa personal\u00c4\u0192: ","contact":"","url":"","details":"Experien\u00c8\u203aa personal\u00c4\u0192: "}]

在这个“\ u00c8 \ u203aa”中这是错误的它应该是“\ u021b”(t)。

所以pho用来创建JSON来解决这个问题。

但我无法确切地知道为什么会这样。请帮忙

2 个答案:

答案 0 :(得分:1)

避免使用Unicode - 请注意额外的参数:

json_encode($s, JSON_UNESCAPED_UNICODE)

请勿使用utf8_encode / decode。

ă变成ă是Mojibake。 可能意味着

  • 客户端中的字节在utf8(正常)中正确编码。
  • 您可能默认与SET NAMES latin1(或set_charset('latin1')或...)相关联。 (应该是utf8。)
  • 表格中的列可能是CHARACTER SET utf8,也可能不是ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...; ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...; ,但应该是这样。

如果您需要修复数据,则需要“两步更改”,例如

SELECT col, HEX(col) FROM tbl WHERE ...

在进行任何更改之前,请执行

ă

有了这个,C483应显示C384C692的十六进制。如果你看到{{1}},你就会有“双重编码”,这很难解决。

答案 1 :(得分:0)

根据数据库中MySql的版本,它可能没有使用完整的utf-8集,如documentation中所述:

ucs2和utf8字符集不支持位于BMP之外的补充字符。 BMP之外的字符比较为REPLACEMENT CHARACTER并转换为'?'转换为Unicode字符集时。

然而,这可能与您的问题无关。我会尝试几种不同的东西,看看它是否能解决你的问题。

  1. 使用SET NAMES utf-8 您可以阅读有关here
  2. 的更多信息
  3. 在将数据插入数据库时​​使用utf8_encode(),在解压缩时使用utf8_decode()。这样,您就不必担心MySql操纵unicode字符了。 Documentation