問題
最近同事反應從 Global.asax Response.Write 出來的內容,顯示到網頁上會有亂碼的狀況。
那個系統是從 .NET 2.X 升級到 .NET 4.X 的系統。
網頁的編碼卻是 Big5。 將網頁的編碼改回成 utf-8 就可以正常顯示中文。
1 | <%@ Application Language="C#" %> |
而 web.config 的 globalization 也都有設定 utf-8 ,檔案編碼也都是使用 UTF-8 BOM 存檔。
1 | <globalization requestEncoding="utf-8" enableClientBasedCulture="true" responseEncoding="utf-8" culture="zh-tw" uiCulture="zh-tw"/> |
研究
有看到網路上 How to add encoding information to the response stream in ASP.NET? 可以先加上 Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble()); 如下,
1 | <%@ Application Language="C#" %> |
加上執行後,網頁果然是正常的 utf-8 編碼。
有人說或許跟 request Gzip 有關,但還是查不到相關的資訊。
但上述那個方式是針對在輸出 csv 時,先輸出一個 UTF-8 的 BOM 字元,
而像前面這樣子,在 BeginRequest 先輸出可能還要測試一下程式。
照理說,這樣子的問題在升級時,應該就會先噴錯了,怎麼可能到現在才出現問題呢?
於是查看一下應用程式集區的設定,目前是使用整合的方式,
記得之前大多升級的專案都還是使用傳統。
於是將應用程式集區從整合改成傳統。
並將原本加上的 HttpContext.Current.Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble()); 移除掉。
結果顯示還是正常的。
所以最後的解法就是 應用程式集區改成用傳統的方式。
參考資料
How to add encoding information to the response stream in ASP.NET?