2012-07-17 58 views
4

我有一個VirtualPathProvider,它將我的數據庫中的源代碼作爲普通字符串並將其編碼爲UTF8。MVC 3 Razor頁面編碼爲utf 8顯示編碼字符

例如:

public override Stream Open() 
{ 
    MemoryStream result = new MemoryStream(); 

    result = new MemoryStream(Encoding.UTF8.GetBytes(_sourceCode)); 

    return result; 
} 

我那麼有有其作爲UTF字符集佈局母版頁8

<meta charset="utf-8"> 

然後將母版頁調用@RenderBody()它得到我的VirtualPathProvider頁,並輸出到瀏覽器。

的問題是,它與它的編碼的字符輸出頁面:

wünschte成爲wünschte

我在做什麼錯?

TLDR:

我想wünschte顯示,而不是wünschte。數據庫中的純字符串是wünschte,但是一旦它從內存流到我的頁面上,就會變成wünschte。

+0

所以你的問題是你不想顯示UTF 8編碼的字符串? – Anand 2012-07-17 09:51:26

+0

通過指定字符集,編碼字符串應呈現爲正常的字符串。無論如何,這就是我所瞭解的。 – Bob 2012-07-17 10:00:30

+0

不,你已經指定了字符集爲UTF-8,所以它會以原始格式顯示所有非英文字符。 – Anand 2012-07-17 10:17:22

回答

5

作爲一個誰今天與他自己的VirtualPathProvider實施掙扎,事實證明,剃刀真的想要的字節順序標記。您可以致電GetPreamble()強制執行此操作。

using System.Linq; // for Concat() because I am lazy 

public override Stream Open() 
{ 
    var template = Encoding.UTF8 
     .GetBytes(this.Template); 
    var buffer = Encoding.UTF8 
     .GetPreamble() 
     .Concat(template) 
     .ToArray(); 
    return new MemoryStream(buffer); 
} 

如果BOM不存在,Razor似乎默認爲當前的代碼頁而不是UTF8。以上爲我固定。

在上面的示例中,您將在原始問題中將this.Template替換爲_sourceCode

+0

我遇到了同樣的問題,並解決了這個問題。應該標記爲正確答案。 – 2014-03-28 20:39:59

+0

使用UTF BOM保存.cshtml文件也很重要。也適用於「常規使用」,而不是通過Stream。 – specimen 2015-05-27 15:30:33