PHP json_encode转码及JS解码utf8mb4_unicode_ci字符串问题咨询
解决utf8mb4转JSON的编码问题
1. 先搞定数据库连接的核心问题
从utf8mb4编码的数据库读取数据时,必须把PHP和数据库的连接字符集设置为utf8mb4——因为utf8mb4是UTF-8的超集,包含所有4字节Unicode字符,设置正确后,你从数据库拿到的字符串本身就是标准UTF-8编码,完全不需要额外转码。
- 用mysqli的设置方式:
$conn = mysqli_connect('数据库地址', '用户名', '密码', '数据库名'); mysqli_set_charset($conn, 'utf8mb4'); - 用PDO的设置方式:
$dsn = 'mysql:host=数据库地址;dbname=数据库名;charset=utf8mb4'; $conn = new PDO($dsn, '用户名', '密码');
2. 正确使用json_encode
PHP的json_encode完全支持UTF-8编码的字符串,包括utf8mb4包含的4字节表情字符。直接把从数据库拿到的字符串传进去就行:
$str = "Linéaire 😀"; // 从数据库正确读取的UTF-8字符串 $json = json_encode($str); // 输出的标准JSON结果:"Lin\u00e9aire \ud83d\ude00"
3. 说说你试的两个转码函数为啥不行
utf8_encode($str):这个函数是专门把ISO-8859-1(Latin-1)编码的字符串转成UTF-8的。如果你的字符串本身已经是UTF-8(比如从utf8mb4数据库正确读取的),用它会导致双重编码,就会出现你看到的\u00c3\u00a9这种错误转义。mb_convert_encoding($str, 'UTF-8', 'Windows-1252'):这个是把Windows-1252编码转成UTF-8的,同样不适合你的场景,会把4字节的表情字符转成乱码,也就是你看到的\u00f0\u0178\u02dc\u20ac。
这两个函数对你的情况完全没用,直接弃用就好。
4. 客户端JavaScript怎么解码
客户端拿到JSON字符串后,直接用JSON.parse()就能自动解码所有字符,包括表情:
const jsonStr = '"Lin\u00e9aire \ud83d\ude00"'; const str = JSON.parse(jsonStr); console.log(str); // 输出:Linéaire 😀
不需要额外写解码逻辑,JSON.parse会自动处理所有Unicode转义序列。
内容的提问来源于stack exchange,提问作者Fifi
相关产品推荐
相关产品推荐

