﻿# 在 ASP.NET 中強迫輸出 BOM 字元的方式

我最近發現就算我的 ASP.NET 頁面是用 UTF-8 編碼(包含[BOM](http://en.wikipedia.org/wiki/Byte_Order_Mark)字元)、或在頁面中設定 ResponseEncoding 為 UTF-8 編碼，最後輸出到瀏覽器的文件都一定不會有 [BOM](http://en.wikipedia.org/wiki/Byte_Order_Mark) ( Byte-order mark ) 字元，這就很有可能造成 Browser 誤判網頁的編碼，我特別強調是「可能」會誤判而已，在我實際的工作經驗裡，瀏覽器在讀取沒有 BOM 字元的 UTF-8 網頁都沒出問題過，不過當我們選取【檢視 -> 原始檔】的時候，網頁內容被預設編輯器開啟的時候，編輯器就真的「很有可能」會誤判了，像我同事的 [Notepad++](http://notepad-plus.sourceforge.net/tw/site.htm) 在開啟網頁原始檔時，就幾乎全部變亂碼必須要手動切換到「編譯成 UTF-8 碼」才會變正常。（奇怪的是這些事總不會在我的電腦發生，不知道是不是我的電腦吃了我太多的口水所致）

 ![像我同事的 Notepad++ 在開啟網頁原始檔時，就幾乎全部變亂碼必須要手動切換到「編譯成 UTF-8 碼」才會變正常](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/838fe0757e1751b67b1c-image_6.png)

而我的解決的方法是在 MasterPage 的 Page\_PreRender 事件中強迫輸出 BOM 字元，問題就自然迎刃而解。

```
protected void Page_PreRender(object sender, EventArgs e) 
{ 
    Response.BinaryWrite(new byte[] { 0xEF, 0xBB, 0xBF }); 
}
```

當然，你也可以直接寫在一般的頁面中，或也可以寫在 BasePage 類別中都可以。

**相關連結**

-   [Byte-order mark ( BOM )](http://en.wikipedia.org/wiki/Byte_Order_Mark) - Wikipedia
-   [Unicode FAQ: UTF-8, UTF-16, UTF-32 & BOM](http://www.unicode.org/faq/utf_bom.html)
-   [FAQ - UTF-8, UTF-16, UTF-32 & BOM: Can a UTF-8 data stream contain the BOM character (in UTF-8 form)? If yes, then can I still assume the remaining UTF-8 bytes are in big-endian order?](http://unicode.org/faq/utf_bom.html#29)
