Форма нормализации Юникода C в представлении ASP.NET Core Razor - PullRequest
0 голосов
/ 15 февраля 2019

Я делаю проверку W3C в ASP.NET Core 2.2 Razor View, но W3C выдает мне предупреждение:

Предупреждение: значение атрибута alt элемента img изпространство имен http://www.w3.org/1999/xhtml отсутствует в форме нормализации Unicode C.

Предупреждение. Значение заголовка атрибута для элемента img из пространства имен http://www.w3.org/1999/xhtml отсутствует в форме нормализации Unicode C.

Мои данные хранятся в базе данных MSSQL как nvarchar, а все остальное установлено в 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);
    }

Razor view

@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&#x30A;r", но вместо этого требуется "Forår",

Как заставить представления ASP.NET Core Razor производить правильное форматирование?

1 Ответ

0 голосов
/ 15 февраля 2019

Существует два способа представления символа å:

  1. Использование кодовой точки Unicode U + 00E5 ( латинская строчная буква A с кольцом над ).

  2. Используя комбинацию двух кодовых точек U + 0061 ( латинская строчная буква A ) и U + 030A ( комбинированное кольцо над ).

Визуально их невозможно различить.И это не относится к HTML, который может представлять обе версии - либо напрямую (с использованием UTF-8, UTF-16) или с использованием экранированной версии (например, &#x30A;).

В вашем случае используется второй способ представления å.

Для управления этой неоднозначностью Unicode имеет четыре формы нормализации : C , D , KC и KD .

Нормализация Unicode также поддерживается C #, более конкретно 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);
}

В долгосрочной перспективе, вероятно, лучше нормализовать все строки перед сохранением их вбаза данных.Если один и тот же текст может быть представлен различными последовательностями кодовых точек, это также вызовет проблемы в запросах к базе данных.И большинство баз данных не могут нормализовать строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...