携带特殊字符的Ajax请求导致应用崩溃,疑似编码或JSON.parse问题
问题根因
- JSON 规范要求字符串必须为 UTF-8 编码,你的数据库使用 iso-8859-1 编码,后端从数据库读取数据后直接输出 JSON 的话,特殊字符的编码不符合 JSON 要求,
JSON.parse解析非法编码的字符串时就会抛出异常导致崩溃 - 前端请求参数编码和后端接收逻辑的编码不匹配,也可能导致查询不到数据或者返回内容乱码
修复方案
前端代码修改
- 移除手动
encodeURIComponent操作:jQuery 发送application/x-www-form-urlencoded格式请求时会自动对参数做编码,手动编码会导致参数被二次转义,后端无法正确读取参数值 - 新增错误捕获逻辑,避免解析失败直接导致页面崩溃
修改后代码如下:
$(document).ready(function() { $("#destinataire").change(function(){ $.ajax({ url: "testNicolas.php", type :'post', contentType : "application/x-www-form-urlencoded; charset=UTF-8", data :{ destinataire : $("#destinataire").val()}, success : function(result) { try { var toStringResult = JSON.parse(result); $('#cp').val(toStringResult.cp); $('#ville').val(toStringResult.ville); $('#ad1').val(toStringResult.ad1); $('#ad2').val(toStringResult.ad2); $('#ATitre').val(toStringResult.aTitre); $('#nom').val(toStringResult.aNom); $('#pays').val(toStringResult.pays); $('#tel').val(toStringResult.tel); $('#mail').val(toStringResult.mail); } catch (e) { // 可根据需要添加异常处理逻辑,比如提示用户操作失败 console.error('数据解析失败', e); } }, error: function (xhr, status, error) { console.error('请求失败', error); } }) }) })
后端(PHP侧)修改
这部分是解决问题的核心,必须调整编码转换逻辑:
- 接收前端传的参数时,先将UTF-8编码的参数转为iso-8859-1编码,再传入数据库查询,避免查询条件乱码
- 从数据库读取到数据后,将所有字段从iso-8859-1编码转为UTF-8编码,再输出JSON字符串
- 输出JSON前指定响应头的编码为UTF-8
示例代码:
<?php // 输出前指定响应编码 header('Content-Type: application/json; charset=utf-8'); // 接收参数后转编码 $destinataire = mb_convert_encoding($_POST['destinataire'], 'ISO-8859-1', 'UTF-8'); // 这里是你原有查询数据库的逻辑 // ... 数据库查询操作 ... $row = 你的数据库查询返回结果; // 查询到结果后转编码 foreach ($row as $key => $value) { $row[$key] = mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1'); } // 输出JSON echo json_encode($row); ?>
验证方法
修改后先测试携带特殊字符的请求,查看后端返回的响应内容是否为正常可识别的特殊字符,没有乱码的话JSON.parse就可以正常解析。
内容的提问来源于stack exchange,提问作者Njdc Wide
相关产品推荐
相关产品推荐

