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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:50:20