BOM 是 Byte Order Mark 的縮寫,中文譯為「位元組順序編號」。

在 Windows 系統中,有一些軟體 (如記事本) 會在寫入或讀取 UTF-8 的文件時,加入 BOM 或是優先去尋找文件中的 BOM 記號,如果沒有找到,就會使用 Windows 系統預設的編碼 cp950 來開啟或寫內文件檔。

但是在 Linux 系統中,這樣的特性則可能會產生一些相容性的問題。

如何判斷文件是否有 BOM 記號

在 bash 中,可以輸入以下指令

grep -r $'\xef\xbb\xbf' 檔案名稱

在 vim 中,可以輸入以下指令,如果回應為「nobomb」,就是沒有 bom 記號,如果回應為「bomb」,則是有 bom 記號

:set bomb?

如何在檔案中加入 BOM 記號

在 vim 中

:set bomb

使用 Python

# 在把資料寫入檔案前,先寫入 BOM 
with open('data.txt', 'wb') as f:
    f.write(b'\xEF\xBB\xBF')

# 再繼續寫入其他資料
with open('data.txt', 'w', encoding='utf-8', newline='') as f:
    # ...

如何移除檔案中的 BOM 記號

在 bash 中

# 方法一
# 使用 grep 找出來,再用 perl 去除
grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
# 方法二
# 使用 find 找出來,再用 sed 去除
find . -type f -exec sed -i 's/\xEF\xBB\xBF//' {} \;

在 vim 中

:set nobomb

參考資料

https://en.wikipedia.org/wiki/Byte_order_mark

https://zh.wikipedia.org/wiki/%E4%BD%8D%E5%85%83%E7%B5%84%E9%A0%86%E5%BA%8F%E8%A8%98%E8%99%9F

Last modified: 2022-01-03

Author

Comments

Write a Reply or Comment

Your email address will not be published.