一次 utf-8 bom引起的问题
同事代码新增加了功能,推到服务器上,意外导致登录失败,回退到之前的版本上,可以正常使用。
这次只上传了 route.php 文件,系统登录失败。
随后使用kdiff3对比了两版本的route.php文件,发现本地的route.php文件是带bom头的utf-8
之后使用 phpstorm批量转换文件格式 ,解决问题
ctrl+A选择项目
接着右键,或者alt+F 选择Remove BOM,这样就好了
UTF-8有BOM和无BOM的区别
BOM——Byte Order Mark,就是字节序标记
概念:
在UCS 编码
中有一个叫做”ZERO WIDTH NO-BREAK SPACE
“的字符,它的编码是FEFF
。而FFFE
在UCS
中是不存在的字符,所以不应该出现在实际传输中。
UCS规范建议我们在传输字节流前,先传输 字符”ZERO WIDTH NO-BREAK SPACE
“。
如果接收者收到FEFF
,就表明这个字节流是大字节序的;如果收到FFFE
,就表明这个字节流是小字节序的。因此字符”ZERO WIDTH NO-BREAK SPACE
“又被称作BOM
。
作用:
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE
“的UTF-8编码
是EF BB BF
。所以如果接收者收到以EF BB BF
开头的字节流,就知道这是UTF-8编码
了。
对php的影响
PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。
受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),也就是说,凡是不能够在执行之前进行输出的代码都将无效
解决方法
通常把文件保存为
不带BOM的UTF-8
文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通