为什么 ASP.NET Core convert Persian(or Arabic) text to Character reference (&#xhhhh;) in view

Why ASP.NET Core convert Persian(or Arabic) text to Character reference (&#xhhhh;) in view

源代码:

@{ ViewBag.Title = "سلام علیک"; }

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>@ViewBag.Title</title>
</head>
<body>

    <div class="container" dir="rtl">
        @RenderBody()
    </div>

</body>
</html>

它在浏览器中呈现得很好,但我想要 html 源中的相同文本(对于某些搜索引擎优化软件)

输出:

<!DOCTYPE html>
<html>
<head>
    <title>&#x633;&#x644;&#x627;&#x645; &#x639;&#x644;&#x6CC;&#x6A9;</title>
</head>
<body>
...
</body>
</html>

对于非 ACII 字符,我建议使用 UTF-8 作为字符集。您可以将此行添加到 HTML 文件(共享布局)中。在 <head> 标签中。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

并设置 dir="rtl" 和 lang="ar",像这样使用:

<p dir="rtl" lang="ar" ">سلام علیک</p>

您也可以使用 ViewData["Title"] 代替 ViewBag.Title 它应该会给出相同的结果。

Character encodings in HTML-wiki

您必须将响应的字符编码设置为 UTF-8,以便能够输出阿拉伯语等非 Unicode 字符

<configuration>
  <system.web>
    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />
  </system.web>
</configuration>

因为,默认情况下,HTML 编码引擎只会将基本拉丁字母列入安全列表(因为浏览器存在错误。所以我们正在努力防范未知问题)。您看到的 &XXX 值仍然像您在屏幕截图中看到的那样正确呈现,因此除了增加页面大小之外没有真正的危害。

如果增加的页面大小困扰您,那么您可以 customise the encoder 安全列出您自己的字符页面(不是语言,Unicode 不考虑语言)

要加宽被编码器视为安全的字符,您可以将以下行插入到 startup.cs;

中的 ConfigureServices() 方法中

services.AddSingleton<HtmlEncoder>( HtmlEncoder.Create(allowedRanges: new[] { UnicodeRanges.BasicLatin, UnicodeRanges.Arabic }));

阿拉伯语有很多 blocks in Unicode,因此您可能需要添加更多块才能获得所需的全部范围。