服务器端俄语JSON编码异常问题求助
俄语JSON编码在服务器端失效问题排查与解决
问题现象
- 服务器端执行
json_encode($data['block'], JSON_UNESCAPED_UNICODE);后,数据库存储的是Unicode转义形式(如"[{"type":"content","data":{"content":"<blockquote>\n<p>Вероятно,),而非原生俄语字符 - 本地环境运行正常:数据库存储原生俄语JSON,
$data["block"]数组含原生俄文,编码后输出为"[{"type":"content","data":{"content":"<p>Это должно сработать редактирую<\/p>"}}]"
排查与解决步骤
1. 检查数据库连接与字段字符集
服务器端数据库连接未配置UTF-8字符集是常见原因:
- 确保数据库连接时指定
utf8mb4字符集:// MySQLi方式 mysqli_set_charset($conn, "utf8mb4"); // PDO方式 $pdo = new PDO("mysql:host=localhost;dbname=your_db;charset=utf8mb4", $user, $pass); - 检查数据库表及字段的字符集设置,确保为
utf8mb4(而非latin1等非Unicode编码)
2. 验证PHP环境默认字符集
服务器端PHP的默认字符集可能未设为UTF-8:
- 在php.ini中配置:
default_charset = "UTF-8" - 或在脚本开头添加:
header('Content-Type: text/html; charset=utf-8');
3. 确认$data['block']的原始编码
如果服务器端的$data['block']已被转义为Unicode字符串(如"\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e"),需先解码再编码:
// 递归解码Unicode转义字符 function decodeUnicode($str) { return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function($match) { return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE'); }, $str); } // 处理数组中所有字符串元素 array_walk_recursive($data['block'], function(&$value) { if (is_string($value)) { $value = decodeUnicode($value); } }); // 执行编码 $json = json_encode($data['block'], JSON_UNESCAPED_UNICODE);
4. 检查PHP版本对JSON_UNESCAPED_UNICODE的支持
JSON_UNESCAPED_UNICODE从PHP 5.4.0开始支持,若服务器版本过低,使用替代方案:
function json_encode_unescaped($data) { $json = json_encode($data); return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function($match) { return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE'); }, $json); } $json = json_encode_unescaped($data['block']);
内容的提问来源于stack exchange,提问作者farhad
相关产品推荐
相关产品推荐

