Asp.net mvc 3 编码为UTF8的MVC3Razor页面显示编码字符

Asp.net mvc 3 编码为UTF8的MVC3Razor页面显示编码字符,asp.net-mvc-3,encoding,razor,utf-8,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 <me

我有一个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。

今天,有人用自己的
VirtualPathProvider
实现来解决这个问题,结果证明Razor确实想要字节顺序标记。您可以通过调用
GetPreamble()
强制执行此操作

如果BOM不存在,Razor似乎默认为当前代码页,而不是UTF8。上面的人帮我修好了


在上面的示例中,您需要将我的实现中的
此.Template
替换为原始问题中的
\u sourceCode

所以您的问题是不想显示UTF 8编码字符串?通过指定字符集,编码字符串应呈现为外观正常的字符串。这就是我对它的理解。不,您已将字符集指定为UTF-8,因此它将以原始格式显示所有非英语字符。然后,我如何在不指定编码的情况下将字节推入内存流?如果不指定编码,字符将不会呈现。将显示一种矩形框,而不是字符。是否要显示此矩形框而不是字符?我遇到了相同的问题,此问题已得到解决。应标记为正确答案。使用UTF BOM保存.cshtml文件也很重要。也用于“常规使用”,而不是通过流。
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);
}