Laravel 5.5本地化函数__($key)随机出现BOM字符问题求助
解决Laravel 5.5中__()函数输出带BOM且两次调用结果不一致的问题
兄弟,我之前踩过一模一样的坑!这种诡异的现象(第一次调用带BOM,第二次正常)其实根源很明确,听我给你拆解:
问题本质
你遇到的情况,99%是本地化语言文件(resources/lang/下的.php文件)带有UTF-8 BOM,而且BOM在<?php标签的前面!
为什么两次调用结果不一样?因为Laravel的语言加载机制是:
- 第一次调用
__()时,会从磁盘加载对应的语言文件; - 由于PHP文件开头的BOM不在
<?php标签范围内,PHP会直接把BOM输出到响应缓冲区,导致你看到的翻译内容前带了%EF%BB%BF; - 第二次调用时,语言文件已经被加载到内存的语言数组里了,不会再读磁盘文件,自然就不会输出BOM,结果就正常了。
解决步骤
检查并修复所有语言文件的编码
用Notepad++打开resources/lang/下的所有.php文件,按以下操作:- 顶部菜单选择「编码」→「转为UTF-8无BOM编码」;
- 直接保存覆盖原文件。
注意:哪怕你用Notepad++显示“没有异常字符”,也一定要手动转码保存——有时候编辑器会自动隐藏BOM,但文件实际还是带BOM的。
清除所有缓存
运行以下命令清空Laravel的各类缓存,避免旧的带BOM的文件内容被缓存:php artisan cache:clear php artisan config:clear php artisan view:clear如果你的服务器开启了OPcache,也要顺便清空OPcache(可以通过phpinfo页面找到OPcache的清除入口,或者重启PHP服务)。
验证问题是否解决
可以写个简单的测试路由快速验证:Route::get('/bom-test', function () { echo __('your.test.key'); // 第一次输出 echo '<br>'; echo __('your.test.key'); // 第二次输出 });访问这个路由,如果两次输出都正常,就说明问题解决了。
额外提醒
不要只修复语言文件!所有PHP文件(控制器、模型、中间件等)都应该用UTF-8无BOM编码,否则不仅会出现奇怪的输出问题,还可能导致header()、setcookie()等函数报错(因为BOM会提前输出内容,破坏HTTP头的顺序)。
内容的提问来源于stack exchange,提问作者Buno
相关产品推荐
相关产品推荐

