UTF-8 BOM带来的困扰

时间:2023-01-06 15:43:57

       前段时间在做php文件下载的时候,老是出问题。本地测试无误的代码,放到服务器上就是下载不了文件,其实文件下载的功能很简单

 

   Header("Content-type: application/octet-stream");
   Header("Accept-Ranges: bytes");
   Header("Accept-Length: ".filesize($filename));
   Header("Content-Disposition: attachment; filename=" .basename($filename));
   readfile($filename);
    exit;

这段代码适合一般的文件下载,大文件需要可以使用fread函数来进行循环分段读取文件内容

而测试的时候发现下载不了,使用Header函数随意赋值一个变量,在页面的http头也没看到信息,说明是Header函数失效。打开报错信息,会提示使用Header函数前已经有输出,但是检查了一遍,没发现前面有输出。

 

网上翻阅资料良久,才找到了罪魁祸首BOM,那么BOM是什么呢?

简单来说BOM就是位于UTF-8编码文件最开头的三个字节的代码,给一些软件来识别这个文本是UTF-8编码的,很多文本处理器在处理的时候会自动添加上去。但是PHP并不支持识别BOM,于是就把他当成正常文本,在页面上的效果,就是直接输出了,但是正常的编码下是看不到这个BOM编码的,于是就有了上面的问题,使用程序循环检测了一遍项目,读取了每个文件,取内容的前三个字节信息对比,BOM编码ASCII值为 239 187191,检测前三字节是否全部匹配。成功匹配则删除这三个字节的信息,试了一下,果然可以成功下载了。

 

BOM还可能影响到的就是页面的编码了,有得程序明明设置好了编码

header("Content-type:text/html;charset=utf-8")

但是还是发现页面的乱码现象,考虑是否为BOM的问题,

 

简单来说BOM会使header函数失效,用到header函数的程序文件,需要注意是否有BOM。