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

Bob*_*Bob 4 encoding utf-8 razor asp.net-mvc-3

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

例如:

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

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

  return result;
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个布局母版页,它的字符集为UTF 8

<meta charset="utf-8">
Run Code Online (Sandbox Code Playgroud)

然后,母版页调用@RenderBody()哪个获取我的VirtualPathProvider页面并将其输出到浏览器.

问题是它正在输出带有编码字符的页面:

wünschte成为wünschte

我究竟做错了什么?

TLDR:

我希望wünschte显示而不是w​​ünschte.来自DB的纯字符串是wünschte,但是一旦它从内存流进入我的页面就变成了wünschte.

Nic*_*cki 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);
}
Run Code Online (Sandbox Code Playgroud)

如果BOM不存在,Razor似乎默认为当前代码页而不是UTF8.以上为我修好了.

在上面的示例中,您将在原始问题中替换this.Template我的实现_sourceCode.