【问题标题】:Unicode Normalization Form C in ASP.NET Core Razor viewASP.NET Core Razor 视图中的 Unicode 规范化表单 C
【发布时间】:2019-07-09 02:46:45
【问题描述】:

我在 ASP.NET Core 2.2 Razor 视图上执行W3C validation,但 W3C 给了我警告:

警告:来自命名空间的元素 img 上的属性 alt 的值 http://www.w3.org/1999/xhtml 不在 Unicode 规范化表单 C 中。

警告:来自命名空间的元素 img 上的属性 title 的值 http://www.w3.org/1999/xhtml 不在 Unicode 规范化表单 C 中。

我的数据以 nvarchar 的形式存储在 MSSQL 数据库中,其他所有内容都设置为 UTF-8。

控制器

    using Dapper;
    using System;
    using System.Data;
    using System.Data.SqlClient;

    public class FileViewModel
    {
        public int FileId { get; set; }
        public string Title { get; set; }
        public string Source { get; set; }
    }

    private async Task<FileViewModel> LoadFileAsync(int id)
    {
        using (SqlConnection conn = new SqlConnection("Conn-string-here"))
        {
            const string sql = "SELECT * FROM dbo.Files WHERE FileId=@Id";

            var data = await conn.QueryAsync<FileViewModel>(sql, new { id }).ConfigureAwait(false);
            return data.FirstOrDefault();
        }
    }

    [Route("~/file/{id}")]
    public async Task<IActionResult> File(int id)
    {
        FileViewModel m = await LoadFileAsync(id).ConfigureAwait(false);
        Return View(m);
    }

剃刀视图

@model FileViewModel

<img src="@Model.Source" alt="@Model.Title" title="@Model.Title" />

输出

<!DOCTYPE html>
<html lang="da">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Title</title>
    <meta name="description" content="my description" />
    <meta name="keywords" content="my keywords" />
</head>
<body>

<!-- Auto generated from database: -->
<img src="https://example.org/img.png" alt="Fora&#x30A;r" title="Fora&#x30A;r" />

</body>
</html>

W3C 似乎不喜欢字符串"Fora&amp;#x30A;r",而是需要"Forår"

如何强制 ASP.NET Core Razor 视图生成正确的格式?

【问题讨论】:

    标签: c# asp.net-core unicode razor-pages


    【解决方案1】:

    字符å有两种表示方式:

    1. 使用 Unicode 代码点 U+00E5 (latin small letter A with ring above)。

    2. 使用两个代码点 U+0061 (latin small letter A) 和 U+030A (combining ring above) 的组合。

    在视觉上,它们无法区分。而且它与 HTML 无关,它可以表示两种版本 - 直接(使用 UTF-8、UTF-16) 使用转义版本(如 &amp;#x30A;)。

    在您的情况下,使用第二种表示 å 的方式。

    为了管理这种歧义,Unicode 有四个normalization formsCDKCKD em>。

    C# 也支持 Unicode 规范化,更具体地说是 String.Normalize

    所以为了摆脱警告,规范化 title:

    [Route("~/file/{id}")]
    public async Task<IActionResult> File(int id)
    {
        FileViewModel m = await LoadFileAsync(id).ConfigureAwait(false);
        m.Title = m.Title.Normalize(NormalizationForm.FormC);
        return View(m);
    }
    

    从长远来看,最好在将所有字符串存储到数据库之前对其进行规范化。如果相同的文本可以用不同的码位序列表示,也会给数据库查询带来麻烦。而且大多数数据库无法对字符串进行规范化。

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 2016-12-01
      • 2018-02-24
      • 2011-06-20
      • 2021-05-06
      • 2013-05-04
      • 1970-01-01
      相关资源
      最近更新 更多