builder.Services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All))了解

一句话作用

把 ASP.NET Core 默认的 HTML 转义器换成“不限制 Unicode 范围”的版本,
防止中文、emoji、西里尔字母等字符被强行转义成 &#xXXXX; 实体,
让网页源码更干净、体积更小。

逐段拆解

  1. HtmlEncoder 是什么
    • 位于 System.Text.Encodings.Web 命名空间;
    • 负责把 < > & " 以及“被认为不安全”的字符转成 &lt; &gt; &amp; &#xXXXX;
    • ASP.NET Core 在 Razor TagHelper、HtmlHelper、JsonSerializer 等内部都拿它做转义。
  2. 默认行为
    框架启动时会自动注册一个“保守”的 HtmlEncoder,它只允许
    BasicLatin(就是 ASCII 码 0-127)不加转义,
    所有中文、emoji、带重音的拉丁字母统统转义成 &#x4E2D;&#x6587; 这种实体,
    导致页面源码膨胀,可读性下降。
  3. UnicodeRanges.All 做了什么
    这个静态属性返回一个数组,里面包含所有已定义的 Unicode 区块(CJK、韩文、 emoji、数学符号……)。
    把它喂给 HtmlEncoder.Create(...) 后,编码器会认为
    “除了真正危及 HTML 语法的 < > & " 之外,其余字符一律原样输出”,
    于是中文、日文、emoji 直接出现在 HTML,不再变成 &#x 实体。
  4. 注册到 DI 容器
    AddSingleton<HtmlEncoder>(...) 用我们自己构造的实例
    替换了框架默认注册的那个“只认 ASCII”的实例。
    此后整个应用
    • Razor 视图
    • @Html.Encode / @Html.Raw
    • TagHelper 输出
    • System.Text.Json 写 HTML 片段
      都会使用这个“全开”的编码器。

完整代码片段

csharp
复制
using System.Text.Encodings.Web;
using System.Text.Unicode;

var builder = WebApplication.CreateBuilder(args);

// 1. 引入包(SDK 已自带,无需额外 NuGet)
// 2. 注册“不转义非 ASCII”的 HTML 编码器
builder.Services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All));

// 3. 其他服务
builder.Services.AddControllersWithViews();

var app = builder.Build();
...

效果对比

表格
场景默认编码器注册后
Razor 输出 <p>你好 😄</p> <p>&#x4F60;&#x597D; &#x1F604;</p> <p>你好 😄</p>
页面大小 增加 2~3 倍 原样输出,体积最小
可读性 一堆 &#x 实体 源码即所见

注意事项

  • 只影响 HTML 实体转义,不会关闭 XSS 保护;
    < > & " 依旧会被转义,放心使用。
  • 如果还要让 JavaScript 字符串也不转义非 ASCII,
    可再配一句:
    csharp
    复制
    builder.Services.AddSingleton(JavaScriptEncoder.Create(UnicodeRanges.All));
     
  • URL 编码无影响,URL 仍按 UTF-8 percent-encoding 规则。

一句话总结

这行代码就是告诉 ASP.NET Core:
“别再把中文和 emoji 转成 &#x 实体了,直接原样输出!”
posted @ 2025-10-09 11:27  yinghualeihenmei  阅读(5)  评论(0)    收藏  举报