Laravel 5.2中utf8_encode问题及前端特殊字符解码方案咨询
解决Laravel Eloquent返回JSON时特殊字符乱码问题
哥们,我之前也踩过类似的坑,你现在的问题大概率是手动调用utf8_encode()导致了双重编码,才让接收端显示异常。咱们一步步来捋清楚解决办法:
1. 先砍掉多余的编码操作
如果你的文章内容本身已经是UTF-8编码(现在主流数据库默认都是这个编码),utf8_encode()会把它先转成ISO-8859-1编码,再转回到UTF-8,相当于给字符套了两层编码,接收端解析自然就乱了。所以第一步就是把这行代码删掉:
// 直接移除这行! $post->content = utf8_encode($post->content);
2. 确保数据库编码配置到位
这是处理特殊字符(比如emoji、生僻字)的基础:
- 检查你的数据库、文章表、
content字段的编码是不是utf8mb4,排序规则用utf8mb4_unicode_ci或者utf8mb4_general_ci(utf8mb4比普通utf8支持更多特殊字符)。 - 打开Laravel的
config/database.php,找到mysql配置项,确认这两个参数:'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
3. 让Laravel原生输出正确的JSON
Laravel的response()->json()默认就会以UTF-8编码输出JSON,直接用它返回数据就行,不需要额外折腾:
// 直接返回查询到的文章集合 $posts = Post::all(); return response()->json($posts);
如果担心响应头有问题,可以强制指定Content-Type:
return response()->json($posts)->header('Content-Type', 'application/json; charset=utf-8');
4. 接收端的小检查
确保接收数据的应用在解析JSON时用的是UTF-8编码。比如前端用JSON.parse()的时候,浏览器默认会按UTF-8处理,只要后端输出正确,一般不会有问题;如果是后端接收,也要确保解析时指定UTF-8编码。
按照这几步来,特殊字符应该就能正常显示了!
内容的提问来源于stack exchange,提问作者prudhvi259
相关产品推荐
相关产品推荐

