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

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

![BlogEngine.NET](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a2650c9895c04ff4489c-image.png "BlogEngine.NET")

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

**問題發生的地方**

![CompressionModule.cs](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f7fff04628ab593e8aa5-image.png "CompressionModule.cs")

![System.Text.Encoding.Default](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5289c90e5304bf8c6dde-image.png "System.Text.Encoding.Default")

**問題發生原因**

由於這個 HttpModules 主要負責所有網頁與 WebResource.axd 的內容壓縮，而輸出內容的壓縮是透過 ASP.NET 的 [Response.Filter](http://msdn.microsoft.com/zh-tw/library/system.web.httpresponse.filter.aspx) 屬性達成的 ( 參考: [介紹一個 ASP.NET 裡鮮為人知的 Response.Filter 屬性](/post/2009/02/21/Introduce-ASPNET-ResponseFilter-Property) )，在 BlogEngine.NET\_1.5\_(source)\\BlogEngine.Core\\Web\\HttpModules\\CompressionModule.cs 檔案最下方有定義一個WebResourceFilter 類別 ( 繼承至 Stream ) 用來將輸出網頁的 WebResource.axd 且類型為 text/javascript 的 URL 替換成有壓縮的網址型態。

由於程式碼中使用 [System.Text.Encoding.Default](http://msdn.microsoft.com/en-us/library/system.text.encoding.default.aspx) 處理所有讀取/寫入作業，不過在「繁體中文」系統下的 [System.Text.Encoding.Default](http://msdn.microsoft.com/en-us/library/system.text.encoding.default.aspx) 並非 UTF-8，而所有 ASP.NET 的輸入輸出都是用 UTF-8 編碼的，所以導致字集混亂的情況，所以亂碼出現一堆。

**解決方式**

對這問題有兩個解法：

**1\. 關閉 Enable HTTP compression 功能**

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b5012dc98e3bfe279557-image.png)

或著可以手動編輯 **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 並重新編譯部署即可。

**相關連結**

-   [Microsoft Web Platform Installer 2.0](http://www.microsoft.com/web/Downloads/platform.aspx)
-   [BlogEngine.NET - An open source ASP.NET 2.0 powered blogging engine](http://www.dotnetblogengine.net/)
-   [BlogEngine.NET @ CodePlex](https://github.com/BlogEngine/BlogEngine.NET)
