# 筆記_工作水坑_UTF8withBOM
---
###### tags: `水坑` `編碼`
筆記內成就皆不來自我
---
[[PHP] 無痛遠離 UTF-8 BOM](https://shian420.pixnet.net/blog/post/349950475-%5Bphp%5D-%E7%84%A1%E7%97%9B%E9%81%A0%E9%9B%A2-utf-8-bom)
[页面顶部空白行,源码显示&#65279解决方法](https://www.wswlyx.com/article/yemiandingbukongbaihangyuanmaxianshijiejuefangfa.html)
[php中隐形字符65279(utf-8的BOM头)问题](https://www.jianshu.com/p/3998f1bef45c)
---
## 目錄(大致分成)
1. 找的到BOM檔
2. 找不到BOM檔
3. ajax
---
20210708更新
除了`` 還多了個 `` 一樣是utf8-withBoom

----
## 找的到BOM檔
網頁中出現一行奇怪的空行
程式中到處找不到哪裡寫出來的
而且還只有開發者工具才看得到...
更有趣的是右鍵*檢視網頁是看不到(後面有個分號)*
當下我反應就是從F12中複製編碼,貼上Google搜尋
不過原本這編碼就是指空行
所以搜尋下去Google大神防範機制只讓我找到 ''(就是讓我什麼都找不到)
> 最近在做一个项目的时候,好几个页面都出现顶部莫名多出一定高度的空白,查看自己写的样式又没有添加这样的样式。查看源码后模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行。

>经查询得知原因是页面的编码是UTF-8 + BOM导致
>這種編碼方式一般會在windows操作系统中出现,比如WINDOWS自带的记事本等软件,在保存一個以UTF-8編碼的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隱藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8編碼。对于一般的文件,这样并不会产生什么麻烦。
>但對於 PHP来说,BOM是个大麻烦。
>因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。
>
>由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!
>面对此种问题用的编辑器中保存成UTF-8的方式可以了
>使用nodepad++就可以了

---
---
## 找不到BOM檔
>google 搜尋 “ php" 後發現其實還蠻多人有遇到一樣的問題!會有這樣的問題發生,是因為網站專案中有使用到 UTF8 含 BOM 編碼的檔案,那究竟什麼是 BOM 呢? BOM 的全名為 Byte Order Mark



### 解決方案:
1. Notepad++
> 找到該檔案並用 Notepad++ 開啟點擊 encoding 並改成 UTF-8 的編碼
2. php code
> 新增 removeBOM.php 檔案輸入檢查 BOM 的網址
### 1. Notepad++
在網路上找到最常見的解法就是將該檔案利用 Notepad++ 編輯器來進行編碼的轉換,轉換方式如下:
1. 找到該檔案並用 Notepad++ 開啟
2. 點擊 encoding 並改成 UTF-8 的編碼
3.
看起來好像沒什麼大不了,是個很容易解決的問題,但當你依照網路上的解法來解決的時候馬上就會遇到一個非常大的問題,那就是到底是哪個檔案為 UTF8 BOM 編碼?
尤其是當你使用的是一個框架,幾乎沒什麼人分享到底該如何找到有該編碼的檔案,此時你可以參考第二個方案來解決問題!
### php code
1 新增 removeBOM.php 檔案
首先在網站根目錄新增 removeBOM.php 檔案,並將下方的程式碼填入其中:
***未測試過!!!請小心使用或根本不要使用!!!!!***
```php=
<?php
//remove the utf-8 boms
//by magicbug at gmail dot com
if (isset($_GET['dir'])){ //config the basedir
$basedir=$_GET['dir'];
}else{
$basedir = '.';
}
$auto = 1;
checkdir($basedir);
/**
* [checkdir 檢查目錄]
* @param [type] $basedir [description]
* @return [type]
* @date 2017-10-29T19:01:11+0800
*/
function checkdir($basedir)
{
if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..'){
if (!is_dir($basedir."/".$file)) {
echo "filename $basedir/$file ".checkBOM("$basedir/$file")." <br>";
}else{
$dirname = $basedir."/".$file;
checkdir($dirname);
}
}
}
closedir($dh);
}
}
/**
* [checkBOM 檢查檔案BOM]
* @param [type] $filename [description]
* @return [type]
* @date 2017-10-29T19:01:19+0800
*/
function checkBOM ($filename)
{
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return ("<font color=red>BOM found, automatically removed.</font>");
} else {
return ("<font color=red>BOM found.</font>");
}
}
else return ("BOM Not Found.");
}
/**
* [rewrite 移除檔頭BOM]
* @param [type] $filename [description]
* @param [type] $data [description]
* @return [type]
* @date 2017-10-29T19:01:40+0800
*/
function rewrite ($filename, $data)
{
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>
```
2. 輸入檢查 BOM 的網址
輸入下方網址,dirname 可以填入需要檢查的資料夾,若不帶 dir 參數則是整個專案的檔案都會進行檢查。
```php=
http://domain/removeBOM.php?dir={dirname}
```
輸入網址後網頁會開始列出所有檔案檢查的狀態,若有檢查到檔案有 UTF8 BOM 編碼會特別以紅字來顯示,並且會自動移除檔頭BOM ,有了這個功能就不用煩惱找不到檔案了呢!

---
## ajax
[php中隐形字符65279(utf-8的BOM头)问题](https://www.jianshu.com/p/3998f1bef45c)
引用
这個65279字符是php用来标记文件是utf-8编码的
输出的時候会一起输出到客户端,导致客户端如果使用ajax得到返回值時,無法匹配字符串。
PHP隐形字符65279解释為:
UTF-8 編碼的文件可以分為 無BOM 和 BOM 兩種格式。