HTMLエスケープ

入力されたURLをリンクで表示したいから、taglibを作ったのは

http://d.hatena.ne.jp/n-kizashi/20080805#1217947846

で書いたとおりである。これはJSPで表示するときの話だったけど、同じようなことを、AjaxJsonでのやりとりでしたかった。つまりActionでエスケープ処理をする必要がある。

つまり、Action上で、

  1. HTMLエスケープをしてから、
  2. URLをリンクにおきかえる

ということが必要になる。

当初は、何も考えず、またエスケープも自前でやるのはあほらしかったので、Commons Langを使って、

str = StringEscapeUtils.escapeHtml(str);
return HtmlUtil.url2link(str)

としていた(HtmlUtilは自作クラスです)。しかしこうすると、

http://hogehoge/foo/barああああ

という文字列の場合、変換したら「ああああ」までリンクに含まれてしまう。これはなんかイヤだ。
よくよくみると StringEscapeUtils.escapeHtml(str) は、日本語もエスケープしてしまうのだ。この場合、「ああああ」と絶対参照に変換されてしまう。そのあと、url2link がかまされるのでまだURL文字列だと認識され、リンク化されてしまうのだ。

日本語はそっとしてほしいのだ。かといって、自前でHTMLエスケープを作るのもいやだなぁと思っていたら、SAStrutsのtaglibにある Functionクラスのescapeメソッドがstaticでpublicになっているのを発見!(そして、そういやこのブログでひがさんとそういうやりとりをしたのを思い出した→http://d.hatena.ne.jp/n-kizashi/20080807#c1218157936

で、解決。