「Text run is not in Unicode Normalization Form C.」というHTML Validation Serviceの警告について

「Text run is not in Unicode Normalization Form C.」というHTML Validation Serviceの警告について

Posted at February 15,2013 12:55 AM
Tag:[HTML, Unicode, Validation]

HTML Validation Serviceで発生した「Text run is not in Unicode Normalization Form C.」という警告の意味について紹介します。

この警告について日本語で書かれた記事はこれが第1号のようです(笑)。

1.問題点

昨日エントリーした「iPadなどのタブレット端末の画面操作に最適なスマートペン「パワーサポート スマートペン」」のページを「W3C Markup Validator」や「(X)HTML5 Validator」にかけたところ、「Text run is not in Unicode Normalization Form C.」という警告が表示されました。

(クリックで拡大)
Text run is not in Unicode Normalization Form C.

スクリーンショットでは「す」が警告の対象になっていますが、ひっかかったのはその部分ではなく、少し手前にある「で」が対象です。

2.「Text run is not in Unicode Normalization Form C.」の意味

まず警告の意味を調べたところ、「実行したテキストは『Unicode正規化形式C』ではありません」ということが分かりました。

ということで「Unicode正規化形式C」とは何かについてさらに調べたました。

3.Unicode正規化とは

Unicodeでは仮名の濁音や半濁音などを表すとき、たとえば「が」を表現する場合、

を用いてもよいし、「か(基底文字)」と濁点の「゛(結合文字)」を結合した、

か゛

を用いてもよいとされています。

前者を「合成済み文字」、後者を「結合文字列」と言います。

結合文字列は、ここでは基底文字と結合文字をそれぞれ1文字ずつ別々に見せていますが、実際にはひとつの文字に見えるようにブラウザで処理されます。

先程の「が」と「か゛」をUnicodeエスケープシーケンス(¥uXXXX)形式に変換すると、それぞれ次のようになります。

が → \u304c
か゛→ \u304b\u3099

ちなみに「¥u3099」は結合文字用のコードで、単独の濁点のコードは「¥u309b」になります。

上のように文字コードが異なっても見た目が等価になることを「互換等価」、文字コードも含めて等価であることを「正規等価」と称するらしいのですが、互換等価な表現方法が文書上に混在していると不便であるため、統一しようというのが正規化 (Normalization) です。

4.「正規化形式C」とは

正規化には以下の4通りがあります。

  • 正規化形式D(Normalization Form D, 略してNFD)
  • 正規化形式C(Normalization Form C, 略してNFC)
  • 正規化形式KD(Normalization Form KD, 略してNFKD)
  • 正規化形式KC(Normalization Form KC, 略してNFKC)

記号の「D/C/K」の意味は次のとおりです。

  • D:分解(Decomposition)
  • C:合成(Composition)
  • K:互換性(Compatibility)

「正規化形式」とは、正規化された結果の形式を指し、それぞれ「Unicode Standard Annex 15」で規定されています。

詳細は割愛しますが、NFDとNFKDはUnicode標準で規定されている「正規分解」および「互換分解」と同じもので、NFCとNFKCは、Unicode Standard Annex 15で規定されている正規合成を使用し、正規分解のあと正規合成を適用したものをNFC、互換分解のあと正規合成を適用したものをNFKCとします。

下の表は「Unicode Standard Annex 15:1.2 Normalization Forms」からの抜粋です。

(クリックで拡大)
Table 1. Normalization Forms

上の説明では分かりにくいと思うので、参考にさせて頂いたページに正規化の具体例が表でまとめられているので掲載しておきます。拡大したものは元サイトでご覧ください。

「Unicode正規化とは」より
Unicode正規化とは

つまり冒頭の警告の意味は、文字列に含まれる「で」という文字が「正規化形式Cではない」ということになります。

もう少し端的に言えば、「ウェブでは合成済み文字を使ってね」ということでしょうか。

5.参考サイト

参考サイトは以下です。ありがとうございました。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)