加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 编码为utf 8的MVC 3 Razor页面显示了编码字符

发布时间:2020-12-16 06:47:40 所属栏目:asp.Net 来源:网络整理
导读:我有一个VirtualPathProvider,它将我的数据库中的源代码作为普通字符串,并将其编码为UTF8. 例如: public override Stream Open(){ MemoryStream result = new MemoryStream(); result = new MemoryStream(Encoding.UTF8.GetBytes(_sourceCode)); return res
我有一个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 becomes w??nschte

我究竟做错了什么?

TLDR:

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

解决方法

作为今天使用他自己的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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读