HTMLのNumeric character references

HTMLには,文字をコードポイントで表す数値文字参照(numeric character references)がある.昨日の飲み会で,Tさんから,NTT DoCoMoの絵文字(ここですでにピンとくる人がいるだろう(苦笑))を数値実体参照で記述すると,あるプロダクトではUTF-8シーケンス中にShift-JISのコードポイントとして挿入されてしまうという話を聞いた.それはひどいバグだから忘れないうちにと,酔っていたにもかかわらず(笑)さっそく問題をその会社にメールしておいた.


それで,今日酔いが醒めた頭で冷静に問題を整理してみた.まず,NTT DoCoMoの定義は次の通り.

  • 形式は以下のとおりです。(末尾のセミコロンは省略不可です。)

 &#*****;(*****:絵文字に対応するShift-JISコードを10進数で表したもの)

  • 形式は以下のとおりです。(末尾のセミコロンは省略不可です。)

 &#x****; (****:絵文字に対応するUnicodeコードを16進数で表したもの)


http://www.nttdocomo.co.jp/p_s/imode/tag/emoji/e1.html#2


これに対してHTML 4.01の定義は次の通り.

  • The syntax "&#D;", where D is a decimal number, refers to the ISO 10646 decimal character number D.
  • The syntax "&#xH;" or "&#XH;", where H is a hexadecimal number, refers to the ISO 10646 hexadecimal character number H. Hexadecimal numbers in numeric character references are case-insensitive.

http://www.w3.org/TR/REC-html40/charset.html#h-5.3.1


げげっ,これって単にNTT DoCoMoが非互換な実装をしているだけじゃない!一応「推奨しません」と書いてあるのだが,その理由はこれか(苦笑)


実は,iモード対応絵文字のドキュメントには,他にも非標準なのに標準のように書いてあるところとか,じっと見ていると浮かび上がるダークな世界(謎…とても私の口からは言えません)があるので,暇な人は探してみると面白いかもしれない.