PHP通过REST API向Android发送泰米尔语JSON显示问号求助
解决泰米尔语JSON在Android端显示问号的问题
看起来你遇到的是字符编码在API传输和解析环节的问题——虽然数据库存储泰米尔语内容正常,但PHP输出JSON时的编码处理没做好,导致Android端收到的字符乱码成问号。我来帮你一步步修复:
1. 修复数据库连接的字符集设置
你现在混用了已废弃的mysql_query()和mysqli扩展,这会导致编码设置完全不生效。而且mysqli_set_charset的位置不对,变量也不匹配(你用了$link但连接对象是$conn)。
把开头的所有mysql_query语句删掉,换成在数据库连接完成后立即设置mysqli的字符集:
// 假设你的DbConnect.php里已经创建了$conn连接对象 mysqli_set_charset($conn, 'utf8mb4'); // 用utf8mb4支持全量Unicode字符,适配泰米尔语等多语言
为什么选utf8mb4?它是UTF-8的超集,能支持所有Unicode字符,比旧的
utf8更全面,适合多语言场景。
2. 修正JSON输出的编码参数
json_encode默认会把非ASCII字符转义成Unicode编码(比如\u0B85),虽然符合JSON标准,但部分Android解析库可能处理不当,导致显示问号。加上JSON_UNESCAPED_UNICODE参数,直接输出原始UTF-8字符:
header('Content-Type: application/json; charset=utf-8'); // 明确指定字符编码 echo json_encode($response, JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE);
⚠️ 注意:header必须在echo之前设置,且脚本开头不能有任何输出(包括空格、换行),否则头信息会失效。
3. 清理脚本中的无效代码&修复安全问题
- 你的脚本里有一段
mysqli_query($conn, $query1);但$query1未定义,这是笔误,建议删掉或补全,避免报错中断输出。 - 直接把
$_POST参数拼进SQL语句有严重的SQL注入风险!一定要改用预处理语句:
// 替换原查询代码 $query = "SELECT que_desc,true_ans FROM question WHERE lesson = ? AND chapter = ?"; $stmt = mysqli_prepare($conn, $query); mysqli_stmt_bind_param($stmt, "ss", $lesson, $chapter); // "ss"表示两个字符串类型参数 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 遍历结果的代码保持不变 $i=1; while($row = mysqli_fetch_assoc($result)) { $response['question'][$i] = $row['que_desc']; $response['ans'][$i] = $row['true_ans']; $i++; }
4. Android端的补充检查
如果做完以上修改仍有问题,检查Android端的网络请求是否用UTF-8解析JSON:
- 比如用OkHttp时,确保响应的MediaType指定为
application/json; charset=utf-8 - 用JSONObject解析时,直接使用原始流解析,不要手动转码
把这些修改应用到你的脚本后,应该就能解决泰米尔语显示问号的问题了。
内容的提问来源于stack exchange,提问作者Anbu Azhagan
相关产品推荐
相关产品推荐

