PHP - 将数据从 MariaDB 转换为 JSON - � 编码错误

问题描述 投票:0回答:1

我似乎在编码方面遇到了一些问题,但我无法确定它。

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
的内容中所有特殊字符均显示为�.

我快疯了,这是怎么回事?

php pdo character-encoding mariadb
1个回答
0
投票

如果您提供了您遇到问题的确切字符串,那就更好了,但我猜您正在处理非 UTF8 数据。我猜如果 PHP 中的字符(字节)超出了 UTF8 范围,它就会返回空字符串。在将字符串传递给

json_encode()
之前尝试重新编码。
您可以在字符串上使用 

json_encode()

,或者如果您的字符串是使用 Windows-1252/ANSI 编码的,您可以使用以下方法:

utf8_encode()

看一下
这个答案

,里面专门讨论了PDO上的这个问题: $str = mb_convert_encoding($str, "UTF-8", "Windows-1252");

© www.soinside.com 2019 - 2024. All rights reserved.