PHP UTF-8编码搞砸了

PHP UTF-8编码搞砸了,php,mysql,json,utf-8,multilingual,Php,Mysql,Json,Utf 8,Multilingual,我正在将一些多语言数据从数据库输出到一个JSON对象中,但输出没有显示外来字符,它只显示问号,即使我将标题字符集设置为utf8,如下所示: header('Content-Type: application/json; charset=utf-8'); 当我查看phpMyAdmin中的数据时,它正确地显示了字符。我做错什么了吗 以下是格式化JSON输出的PHP代码: $numRows = new stdClass(); $mysqli = dbiConnect(); $query = "SE

我正在将一些多语言数据从数据库输出到一个JSON对象中,但输出没有显示外来字符,它只显示问号,即使我将标题字符集设置为utf8,如下所示:

header('Content-Type: application/json; charset=utf-8');
当我查看phpMyAdmin中的数据时,它正确地显示了字符。我做错什么了吗

以下是格式化JSON输出的PHP代码:

$numRows = new stdClass();

$mysqli = dbiConnect();
$query = "SELECT * FROM country_codes";
if ($stmt = $mysqli->prepare($query)) {
    /* execute query */
    $stmt->execute();

    /* store result */
    $stmt->store_result();
    $numRows->cc = $stmt->num_rows;

    /* close statement */
    $stmt->close();
}
$mysqli->close();

$count = 0;
$dataCountryCodes = '{';
    $mysqli = dbiConnect();
    $query = "SELECT * FROM country_codes";
    if ($result = $mysqli->query($query)) {
        while($row = $result->fetch_assoc()){
            $count++;
            $rowData = new stdClass();
            $rowData->code = $row['code'];
            $rowData->name = $row['name'];
            $dataCountryCodes = $dataCountryCodes.'"'.$rowData->code.'": {"Code":"'.$rowData->code.'","Country":"'.$rowData->name.'"}';

            if ($count != $numRows->cc) {
                $dataCountryCodes = $dataCountryCodes.',';
            }
        }
    }
    $mysqli->close();
$dataCountryCodes = $dataCountryCodes.'}';
if ($returnCountryCodes == 1) {
    return $dataCountryCodes;
} else {

    header('Content-Type: application/json; charset=utf-8');
    echo ($dataCountryCodes);
}
这就是我得到的:

{"AE": {"Code":"AE","Country":"United Arab Emirates (???????? ???????? ????????)"}}
这是我在手工编码时得到的结果,在我将JSON翻译成HTML后,这将很好地呈现:

{"AE": {"Code":"AE","Country":"United Arab Emirates (الإمارات العربيّة المتّحدة)"}}

您没有显示dbiConnect函数。连接到MySQL后,请检查并尝试使用
设置名称“UTF8”

$con=mysqli_connect("host", "user", "pw", "db");
if (!$con)
{
    die('Failed to connect to mySQL: ' .mysqli_connect_errno());
}

/* change character set to utf8 */
if (!$con->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $con->error);
}
正如政府所说:

SET NAMES指示客户端将使用哪个字符集发送SQL 向服务器发送的语句。。。它还指定服务器应该使用的字符集 用于将结果发送回客户端

试试这个:

$mysqli = dbiConnect();
$mysqli->query("set names utf8")

您确定数据从数据库中出来是正确的,还是首先正确地放入了数据库中?您的DB表/字段可能设置为utf-8,但您的整个渲染管道也必须设置为utf-8,包括phpdb连接。phpmyadmin的显示可能是正确的,因为它有一个正确配置的连接,而您的代码不是t@MarcB我添加了更多的细节,当我在DB管理工具中查看DB中的数据时,它是很好的…里面有什么
dbiConnect()
?我猜您的数据库连接字符集没有正确定义。