XHTML5で実体参照を使う方法

Posted by Hiraku on 2012-01-22

HTML5にはXHTML版の記法も用意されていて、XMLが好きな人でも書けるようになっています。が、色々見ていたら「実体参照が使えない」という問題があるようで。。

「<」(&lt;)とか「&」(&amp;)とかの実体参照はXMLの基本仕様に入ってるので問題ありませんが、「コピーライトマーク」(&copy;)や「≫」(&raquo;)、さらには空白(&nbsp;)など、追加の実体参照はXHTML5では使えません。

なにせこの辺の特殊文字はDTDに書かれてるので、外部DTDを指定しないXHTML5では構文エラーになってしまうのです。

そんなわけで、これらの文字を使いたいときは「&#169;」(コピーライトマーク)のように、エンティティコードを直接指定して書くことになります。うおお面倒くさっ!

XHTML5 移行メモ

必死の Web ハッカーへの推奨事項: &lt;、&gt;、&amp;、&quot;、&apos; を除き、名前指定による文字実体参照を使わないこと。

XML 的思索: HTML5 の XML 的な部分

実際、以下のようなXHTMLをContent-Type: application/xhtml+xmlを送りつつブラウザで見ようとするとパースエラーが発生して閲覧できません。

サンプルXHTML5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>XHTML5 test</title>
  </head>
  <body>
    <header>
      <h1>XHTML5 test</h1>
    </header>
    <section>
      <dl>
        <dt>nbsp</dt>
        <dd>&nbsp;</dd>
        <dt>yen</dt>
        <dd>&yen;</dd>
        <dt>plusmn</dt>
        <dd>&plusmn;</dd>
        <dt>minus</dt>
        <dd>&minus;</dd>
      </dl>
    </section>
  </body>
</html>

うーむ。。yenやminusのような機種依存文字は結構使うし、困りますね。

定義がないなら自分で定義すればいいじゃない

DTDって、確か直接XML中に埋め込めたはず。ということで、必要な実体参照の定義を直接埋め込んでしまえば、パースエラーになりません

エラーにならないサンプル
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html [
<!ENTITY nbsp "&#160;">
<!ENTITY yen "&#165;">
<!ENTITY plusmn "&#177;">
<!ENTITY minus "&#8722;">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>XHTML5 test</title>
  </head>
  <body>
    <header>
      <h1>XHTML5 test</h1>
    </header>
    <section>
      <dl>
        <dt>nbsp</dt>
        <dd>&nbsp;</dd>
        <dt>yen</dt>
        <dd>&yen;</dd>
        <dt>plusmn</dt>
        <dd>&plusmn;</dd>
        <dt>minus</dt>
        <dd>&minus;</dd>
      </dl>
    </section>
  </body>
</html>

参考:6. エンティティ宣言 1 | TECHSCORE(テックスコア)

よーし、これで実体参照が使えますね。名前とコードの対応表はHTML4の定義を見るといいですよ。

Character entity references in HTML 4

本当にこれ使っていいの?

Mac版のFirefox、Opera、Chrome、Safari(いずれもstable最新)、Windows7のIE9は問題なく動いているようでした。IE8未満はそもそもContent-Type:application/xhtml+xmlを認識してくれないので仕方ないですね。IE対応は面白い話じゃないので省略。

PHPのDOMモジュールでXMLをパースしようとしたところうまく行かず。。。orz エンティティが空っぽにされてしまいました。

直接埋め込みの実体参照をちゃんと扱えるかどうかは実装によるようです。なので使っていいかというと、動作検証をきっちりやることが必要だと思います。

keyword: HTML

designの最新記事