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); ?>
额外检查步骤
- 检查数据库和表的字符集:执行以下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;
- 确认PHP文件编码:用编辑器(比如VSCode)把你的PHP文件编码设置为UTF-8(无BOM),避免文件本身的编码问题导致乱码。
内容的提问来源于stack exchange,提问作者Ala
相关产品推荐
相关产品推荐

