You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中阿拉伯语显示异常:仅输出问号问题求助

解决PHP中阿拉伯语显示为???的问题

嘿,我看了你的代码,发现几个关键问题导致阿拉伯语显示成问号,咱们一步步来解决:

1. 别混用mysql和mysqli扩展!

你用mysqli_connect()建立了连接,但后面却用废弃的mysql_query()来设置字符集——这俩根本不兼容!mysql扩展早就被PHP淘汰了,必须全程用mysqli的方法。

2. 字符集设置要正确且及时

连接数据库后,立刻用mysqli_set_charset()来设置字符集,推荐用utf8mb4,它支持所有Unicode字符(包括阿拉伯语、表情符号这些),比旧的utf8更全面。

3. 别乱加utf8_encode()

如果你的数据库已经存的是UTF-8编码的阿拉伯语,utf8_encode()会把它转成乱码——这个函数是用来把ISO-8859-1编码转成UTF-8的,完全不适合你的场景。

4. 还要检查数据库和表的字符集

如果你的数据库或者user表本身不是utf8mb4编码,那存进去的阿拉伯语本身就是乱码,读出来自然是???。


修正后的完整代码

我给你调整了代码,还加了预处理语句防止SQL注入,更安全:

<?php
// 数据库连接参数
$host="****";
$user="****";
$password="****";
$dbname="****";

// 建立mysqli连接并检查是否成功
$con = mysqli_connect($host, $user, $password, $dbname);
if (!$con) {
    die("连接失败: " . mysqli_connect_error());
}

// 设置字符集为utf8mb4
mysqli_set_charset($con, "utf8mb4");

$lang = trim($_GET['lang']);
// 注意:确保$rtt变量已经正确定义,避免报错
$sql = "SELECT title, image, rating, releaseYear, id, pays, language 
        FROM user 
        WHERE language = ? AND pays = ? 
        ORDER BY id DESC";

// 使用预处理语句,防止SQL注入
$stmt = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, "ss", $lang, $rtt);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

$flag = [];
if ($result) {
    while ($row = mysqli_fetch_assoc($result)) {
        // 直接使用数据库返回的原始数据,不需要转码
        $flag[] = [
            'title' => $row['title'],
            'image' => $row['image'],
            'rating' => $row['rating'],
            'releaseYear' => $row['releaseYear'],
            'id' => $row['id']
        ];
    }
    // 设置响应头为UTF-8编码的JSON
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($flag, JSON_UNESCAPED_UNICODE);
}

// 关闭资源
mysqli_stmt_close($stmt);
mysqli_close($con);
?>

额外检查步骤

  1. 检查数据库和表的字符集:执行以下SQL确认:
SHOW CREATE DATABASE your_dbname;
SHOW CREATE TABLE user;

如果不是utf8mb4,执行下面的SQL修改:

ALTER DATABASE your_dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  1. 确认PHP文件编码:用编辑器(比如VSCode)把你的PHP文件编码设置为UTF-8(无BOM),避免文件本身的编码问题导致乱码。

内容的提问来源于stack exchange,提问作者Ala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:07:52