使用FlightPHP时JSON无法转UTF-8,浏览器显示乱码如何解决?
修复FlightPHP接口JSON浏览器乱码问题
导致浏览器显示JSON乱码的核心原因是响应头未明确指定UTF-8编码,或者数据库连接未使用UTF-8编码读取数据。以下是两种关键修复步骤:
1. 确保数据库连接使用UTF-8编码
修改PDO注册时的DSN,添加charset=utf8mb4参数,保证从数据库读取的数据是UTF-8编码:
Flight::register('db', 'PDO', array('mysql:host=localhost;dbname=api;charset=utf8mb4','root',''));
utf8mb4比utf8支持更全面的Unicode字符(比如Emoji),推荐使用。
2. 明确设置JSON响应的字符编码
Flight的json()方法可以通过参数指定编码,或者手动添加响应头强制浏览器使用UTF-8解析:
方法一:使用json()方法的编码参数
Flight::json($data, 200, true, 'UTF-8');
第四个参数就是响应内容的字符编码,设置后会自动在响应头中添加charset=utf-8。
方法二:手动添加响应头
如果方法一不生效,可以在Flight::json()之前手动设置响应头:
Flight::header('Content-Type: application/json; charset=utf-8'); Flight::json($data);
修改后的完整代码
<?php require 'flight/Flight.php'; // 数据库连接添加UTF-8编码 Flight::register('db', 'PDO', array('mysql:host=localhost;dbname=api;charset=utf8mb4','root','')); Flight::route('GET /personas', function () { $sentence = Flight::db()->prepare("SELECT * FROM `persons`"); $sentence->execute(); $data = $sentence->fetchAll(PDO::FETCH_ASSOC); // 手动设置响应头或使用json方法的编码参数 Flight::header('Content-Type: application/json; charset=utf-8'); Flight::json($data); }); Flight::start(); ?>
原理说明:API客户端(如Postman)通常默认以UTF-8解析响应内容,但浏览器会优先根据响应头的charset字段决定编码,若未明确指定,可能会使用系统默认编码(如GBK),导致JSON中文乱码。通过以上两步,既能保证数据从数据库读取时是UTF-8,又能强制浏览器用UTF-8解析响应,即可解决乱码问题。
内容的提问来源于stack exchange,提问作者emiliorivas16
相关产品推荐
相关产品推荐

