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