编码为utf 8的MVC 3 Razor页面显示编码字符

时间:2012-07-17 09:48:43

标签: asp.net-mvc-3 encoding razor utf-8

我有一个VirtualPathProvider,它将我的数据库中的源代码作为普通字符串,并将其编码为UTF8。

例如:

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。来自DB的普通字符串是wünschte,但是一旦它来自我的页面上的内存流就变成了wünschte。

1 个答案:

答案 0 :(得分:6)

作为今天用自己的VirtualPathProvider实现努力解决这个问题的人,事实证明Razor 确实想要字节顺序标记。您可以致电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