【问题标题】:JSON creating from PHP giving wrong data?从 PHP 创建的 JSON 提供了错误的数据?
【发布时间】:2015-09-24 14:44:51
【问题描述】:

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

我还有另一个 PHP 文件,用于从同一个数据库表创建 JSON。

在这里,当我输入诸如“Experiența personală”之类的外语时,保存在 DB 中的值是“ExperienÈ›a personală:”,但是当我使用选择查询以相同的 php 形式显示它时,它会正确显示“Experiența personală:” .所以数据库是正确的,现在正在使用以下 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 来解决这个问题。

但是我无法确切地找到它为什么会这样。请帮忙

【问题讨论】:

  • 您确定数据库中的数据正确吗?在编码之前尝试对$taxi 数组进行var_dump
  • 是的 db 是正确的,因为当我尝试对同一个 php 文件进行选择查询时,我得到了正确的日期。好的,我会这样做并让你知道
  • array(4) { [0]=> array(5) { ["code"]=> string(3) "CT1" ["name"]=> string(29) "ExperienÃ^â €ºapersonalÄÆ': " ["contact"]=> string(10) "4535623643" ["url"]=> string(30) "images/offers/event-logo-8.jpg" ["details" ]=> string(66) "ExperienÃ^›a personalÄÆ': jerhbehwgrh 234234 hjfhjerg#$%$#%#4" } [1]=> array(5) { ["code"]=> string(4) “ewrw”
  • var dump 就这样来了

标签: php mysql json encoding utf-8


【解决方案1】:

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

json_encode($s, JSON_UNESCAPED_UNICODE)

不要使用 utf8_encode/decode。

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

  • 客户端中的字节已正确编码为 utf8(良好)。
  • 您可能默认连接到SET NAMES latin1(或set_charset('latin1') 或...)。 (应该是utf8。)
  • 表格中的列可能是CHARACTER SET utf8,也可能不是,但应该是这样。

如果您需要修复数据,则需要“2 步 ALTER”,例如

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,你有“双重编码”,这更难修复。

【讨论】:

    【解决方案2】:

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

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

    但是,这不太可能与您的问题有关。我会尝试几种不同的方法,看看是否能解决您的问题。

    1. 使用SET NAMES utf-8 你可以阅读更多关于here
    2. 向数据库插入数据时使用utf8_encode(),提取时使用utf8_decode()。这样,您就不必担心 MySql 会操纵 unicode 字符。 Documentation

    【讨论】:

    • 伙计,我已经说过,当我直接从 php 查询选择时,我得到了相同的正确数据,只有当我生成 json 时出现问题
    • 按照我的建议尝试编码
    • 在那之后它没有打印任何东西,我像这样添加了 echo utf8_encode($taxi)
    • 你想单独编码每个字符串,而不是整个数组。
    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多