UTF-8字符无法以JSON格式正确显示
我使用json从我的数据库中回显变量。但是显示为■。UTF-8字符无法以JSON格式正确显示
在试图纠正这一点,我已经做到了这一点:
没有运气。任何想法如何解决。
编辑:
if (isset($_GET['term'])){
$return_arr = array();
try {
$conn = new PDO("mysql:host=".DB_SERVER.";port=8889;dbname=".DB_NAME, DB_USER, DB_PASSWORD);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare('SELECT School FROM Schools WHERE School LIKE :term');
$stmt->execute(array('term' => '%'.$_GET['term'].'%'));
while($row = $stmt->fetch()) {
$return_arr[] = $row['School'];
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
/* Toss back results as json encoded array. */
echo mb_detect_encoding($return_arr, 'auto');
}
首先,看看你的表是不是编码为utf8
。它应该是这个样子:
CREATE TABLE `Schools` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`School` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后连接到你的数据库是这样的:
$dsn = 'mysql:dbname=test;host=127.0.0.1;port=3306;charset=utf8';
$user = 'root';
$password = 'password';
$conn = new PDO($dsn, $user, $password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]);
最后用JSON_UNESCAPED_UNICODE
:
echo json_encode($row, JSON_UNESCAPED_UNICODE);
这应该做的伎俩。
UPDATE
这个工作在PHP7.1在我上面提供的表格:
if (isset($_GET['term'])) {
$return_arr = array();
try {
$conn = new PDO("mysql:host=127.0.0.1;port=8101;dbname=test;charset=utf8", $user, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare('SELECT School FROM Schools WHERE School LIKE :term');
$stmt->execute(array('term' => '%'.$_GET['term'].'%'));
$return_arr = [];
while($row = $stmt->fetch()) {
$return_arr[] = $row['School'];
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
/* Toss back results as json encoded array. */
echo json_encode($return_arr, JSON_UNESCAPED_UNICODE);
}
它不是数据库。我通过编写一个test.php来测试没有json的回显变量。没有JSON,它显示正确。 –
@CharlesTester当你连接到数据库时,你仍然需要设置字符集,没有字符集就无法工作。看到我更新的答案。 – zstate
1)json_encode
使用JSON_UNESCAPED_UNICODE
。
2)确保以UTF-8字符集(UTF-8 all the way through)输出和输入数据存储,数据访问, 。
它不是数据库。我通过编写一个test.php来测试没有json的回显变量。没有JSON,它显示正确。 –
你有没有考虑过了'JSON_UNESCAPED_UNICODE'标志?参见http://php.net/manual/en/function.json-encode.php。 –
我尝试过,但结果仍然相同 –
echo mb_detect_encoding('■','auto');返回它已经是UTF-8。 JSON_UNESCAPED_UNICODE不会帮助你,因为“\ xc3 \ xa9”是é的非转义Unicode。我怀疑问题出在你的数据库字符集 – miknik