ASP.NET Core 2.2 Razor ViewでW3C検証を行っていますが、W3Cで警告が表示されます。
警告:名前空間http://www.w3.org/1999/xhtmlの要素imgの属性altの値は、Unicode正規化フォームCではありません。
警告:名前空間http://www.w3.org/1999/xhtmlの要素imgの属性titleの値は、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);
}
かみそりの眺め
@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="Forår" title="Forår" />
</body>
</html>
W3Cは文字列"Forår"
が好きではないようですが、"Forår"
代わりに必要です。
ASP.NET Core Razorビューに適切なフォーマットを生成させるにはどうすればよいですか?
キャラクターを表現する方法は2つありますå
。
UnicodeコードポイントU + 00E5(上にリングが付いたラテン小文字A)を使用します。
2つのコードポイントU + 0061(ラテン小文字A)とU + 030A(上記のリングの組み合わせ)の組み合わせを使用します。
視覚的には区別できません。また、HTMLとは関係ありません。HTMLは、直接(UTF-8、UTF-16を使用)またはエスケープされたバージョン(など̊
)を使用して、両方のバージョンを表すことができます。
あなたの場合、表現する2番目の方法å
が使用されます。
この曖昧さを管理するために、ユニコードは、4つの有している正規形:C、D、KC、およびKDを。
Unicode正規化は、C#、より具体的にはString.Normalizeでもサポートされています。
したがって、警告を取り除くために、タイトルを正規化します。
[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);
}
長期的には、データベースに保存する前に、すべての文字列を正規化することをお勧めします。同じテキストを異なるコードポイントシーケンスで表すことができる場合、データベースクエリでも問題が発生します。そして、ほとんどのデータベースは文字列を正規化することができません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加