我似乎在编码方面遇到了一些问题,但我无法确定它。
PHPMyAdmin 说:
Server type: MariaDB
Server version: 10.3.39-MariaDB-log - MariaDB Server
Server charset: ISO 8859-2 Central European (latin2)
Server connection collation: utf8mb4_unicode_ci
我无法以任何方式更改 SQL 服务器,这是由我的网站托管提供商提供的。
我所有的数据库、表和列都使用
utf8mb4_unicode_ci
。所有文件都编码为 UTF-8
。这些值在 PHPMyAdmin 和 MySQLWorkbench 中都正确显示。我网站上的其他脚本工作正常,显示英语、俄语、中文等。只是这个脚本由于某种原因不符合要求。我尝试通过 PHPMA、Workbench,甚至从同一个脚本插入数据。
我通过包含的文件使用 PDO 进行连接,并指定了字符集:
<?php
if (!isset($pdo))
{
$DBHOST = 'localhost';
$DBNAME = '***';
$DBUSER = '***';
$DBPASS = '***';
$DBCHRS = 'utf8mb4';
$dsn = 'mysql:host='.$DBHOST.';dbname='.$DBNAME.';charset='.$DBCHRS;
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false];
try
{
$pdo = new PDO($dsn, $DBUSER, $DBPASS, $options);
}
catch (\PDOException $e)
{
echo 'Could not connect to the database!<br>Message: ', $e->getMessage(), '<br>Code: ', $e->getCode();
exit();
}
}
?>
然后
$json = [];
$json['people'] = [];
$json['relations'] = [];
$stmt = $pdo->prepare('SELECT * FROM `tree_people`;');
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
$json['people'][] = $row;
$stmt = $pdo->prepare('SELECT * FROM `tree_relations`;');
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
$json['relations'][] = $row;
/*/
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json; charset=utf-8');
/*/
header('Content-Type: text/html; charset=utf-8');
//*/
//*/
echo '<pre>';
print_r($json);
echo '</pre>';
//*/
echo '<pre>';
echo json_encode($json, JSON_UNESCAPED_UNICODE);
echo '</pre>';
JSON 生成失败(空字符串?)且显示
print_r
的内容中所有特殊字符均显示为�.
我快疯了,这是怎么回事?