5

我有一个 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。数据库中的纯字符串是 wünschte,但是一旦它从内存流中进入我的页面,它就会变成 wünschte。

4

1 回答 1

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为原始问题中的。

于 2013-05-03T14:28:52.743 回答