The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

解決 BlogEngine.NET 1.5.0 在安裝後出現中文亂碼的問題

這個週末透過 Web Platform Installer 2.0 安裝了 BlogEngine.NET 1.5.0 來用,安裝是非常容易,但安裝後首次開啟網頁卻發現一大堆中文亂碼 (如下圖示),下載原始碼研究之後隨即找到發生問題的主因,我發現在專案網站雖有人發問提到這個問題,但似乎幾個月下來尚未修復,如果有需要的人可以參考此文。

BlogEngine.NET

在所有「非英語系」的環境下都會發生此問題,會出現亂碼的問題是因為 BlogEngine.Core 專案中的 CompressionModule 模組沒寫好的關係,我先說明問題發生的原因再說明解決方法。

問題發生的地方

CompressionModule.cs

System.Text.Encoding.Default

問題發生原因

由於這個 HttpModules 主要負責所有網頁與 WebResource.axd 的內容壓縮,而輸出內容的壓縮是透過 ASP.NET 的 Response.Filter 屬性達成的 ( 參考: 介紹一個 ASP.NET 裡鮮為人知的 Response.Filter 屬性 ),在 BlogEngine.NET_1.5_(source)\BlogEngine.Core\Web\HttpModules\CompressionModule.cs 檔案最下方有定義一個WebResourceFilter 類別 ( 繼承至 Stream ) 用來將輸出網頁的 WebResource.axd 且類型為 text/javascript 的 URL 替換成有壓縮的網址型態。

由於程式碼中使用 System.Text.Encoding.Default 處理所有讀取/寫入作業,不過在「繁體中文」系統下的 System.Text.Encoding.Default 並非 UTF-8,而所有 ASP.NET 的輸入輸出都是用 UTF-8 編碼的,所以導致字集混亂的情況,所以亂碼出現一堆。

解決方式

對這問題有兩個解法:

1. 關閉 Enable HTTP compression 功能

由於進入後台後,預設也是一堆亂碼,要找到選項不太容易,下圖是提示的地方:

或著可以手動編輯 App_Data\settings.xml 檔案,並將 compresswebresource 的設定把 True 改為 False 即可,或將 enablehttpcompression 的設定把 True 改為 False 也可以。

 <compresswebresource>True</compresswebresource>
 <enablehttpcompression>True</enablehttpcompression>

2. 修正 CompressionModule 模組的原始碼

將 BlogEngine.NET_1.5_(source)\BlogEngine.Core\Web\HttpModules\CompressionModule.cs 檔案中所有的 System.Text.Encoding.Default 全部改成 System.Text.Encoding.UTF8 並重新編譯部署即可。

相關連結