PHP对象转数组中文乱码本质是编码链路断裂,需全程统一UTF-8:一、确保源对象中文已是UTF-8,否则用mb_detect_encoding+mb_convert_encoding递归转码;二、避免json_decode(json_encode($obj))陷阱,改用JSON_UNESCAPED_UNICODE或(array)$obj;三、输出前设header('Content-Type: text/html; charset=utf-8')并确认文件为UTF-8无BOM;四、数据库连接须设utf8mb4字符集。

PHP对象转数组时出现中文乱码,本质是字符编码在转换链路中某处断裂——不是对象本身的问题,而是输出、解析或存储环节未统一使用UTF-8。只要确保“文件→PHP内部→JSON序列化→解码→输出”全程无编码跳变,就能稳定解决。
一、确认源对象的中文已是UTF-8编码
如果对象来自数据库、文件或API,中文可能原始就是GBK、GB2312等编码。直接转数组无效,必须先转码:
- 用 mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true) 检测字符串真实编码
- 再用 mb_convert_encoding($str, 'UTF-8', $detected) 统一转为UTF-8
- 对整个对象,可递归遍历所有字符串属性做此处理(尤其适用于SimpleXML或自定义对象)
二、转数组过程避开JSON陷阱
很多人用 json_decode(json_encode($obj), true) 转对象为数组,但这个组合极易引发中文乱码,原因有二:一是 json_encode() 默认不处理非UTF-8输入;二是若对象含Unicode转义(如"\u4f60\u597d"),而环境未正确识别,解码会失败。
- 强制指定 JSON_UNESCAPED_UNICODE 选项:
json_decode(json_encode($obj, JSON_UNESCAPED_UNICODE), true) - 若仍报错,先用 json_last_error() 查错误码,常见为 JSON_ERROR_UTF8,说明输入含非法字节,需前置清洗
- 更稳妥替代方案:用 (array) $obj 强制类型转换(仅限public属性,不递归,但零编码风险)
三、输出前确保HTTP头与内部编码一致
即使数组内容正确,浏览器也可能因缺少声明而误判编码:
- 在任何 echo/print/var_dump 前,加:
header('Content-Type: text/html; charset=utf-8'); - 同时设置PHP内部多字节编码:
mb_internal_encoding('UTF-8'); - 检查PHP文件本身是否保存为UTF-8无BOM(VS Code右下角编码显示,点开选“Save with Encoding → UTF-8”)
四、数据库来源对象要连通字符集
从MySQL查出的对象含中文乱码,90%是因为连接层未设utf8mb4:
- Mysqli连接后立即执行:
$mysqli->set_charset('utf8mb4'); - PDO连接DSN中加入:
charset=utf8mb4(如 mysql:host=localhost;dbname=test;charset=utf8mb4) - 确认表字段也是 utf8mb4_unicode_ci,而非旧版 utf8(后者不支持4字节emoji和部分生僻汉字)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











