2012-07-17 121 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