みなさん,こんばんは。
FHさんの「FHの掲示板」No.1207~No.1225 での「薭の件。」について,KENTさんのところのjoyful.zip をダウンロードして,少しカスタマイズしてみました。
実は,上の行の「薭の件。」の&は全角です。数値参照で文字にしてもらいたい場合と,コードのまま書いてもらいたい場合の仕分け方法は,人間が指定しなくてはいけませんが,そこまではできていないので,ごまかしですが,薭のまま表示したいときは,&を全角で入れています。
カスタマイズに当たって,参考というか流用させていただいたのは,「&の実体参照への変換」です。↓
http://www.akatsukinishisu.net/wiki.cgi?%26%A4%CE%BC%C2%C2%CE%BB%B2%BE%C8%A4%D8%A4%CE%CA%D1%B4%B9
上記の下の方にあるサンプルスクリプトを流用しました。
簡単なカスタマイズの方法としては,
$val =~ s/&/&/g; を #$val =~ s/&/&/g;
というのはすぐ思いつきましたが,
「【PHP関連】「&」(アンパサンド)をエスケープしなければならない実例」↓
http://shimax.cocolog-nifty.com/search/2007/12/php_f864.html
を読むとそれはまずいようです。2007/12にまずいなら今でもまずいだろうということで,薭のような数値参照を,その数値によって条件分岐して処理するという方法を考えました。
しかし,Perlに疎い悲しさ,自分ではどうにもならず,投げようかなと思ったときに,「&の実体参照への変換」を発見しました。で,これを流用しまして,joyful.zip 内のinit.cgiを書き直しました。この方法は,「HTMLで有効な文字の範囲」をSGML宣言を参照してきちんと分類し,対処しているようです。したがって,テーブルは使用していませんが「変換テーブルを作成して対処するホワイトリスト方式」の一種と言えるのではないかと思います。
というわけで
「薭」
が表示されました。
なおかつ,「【PHP関連】「&」(アンパサンド)の部分のソースを見ていただけばわかるように,補助漢字に関係ない半角のアンパサンドは,ちゃんと&になっています。
追記(8/17):
8/14に掲示板を整理し,UTF-8版を使うようにしました。そのときに,それまでにSHIFT-JIS版に投稿されていた記事についても一緒にしてしまいました。したがって,上記の全角&等についての言及はSHIFT-JIS版での話です。