2009年06月30日

【1日1Commons】HTML,Javascript,XMLのエスケープ

// JRE 1.6.0_07
// Commons Lang 2.4
// HTML,Javascript,XMLのエスケープ
// org.apache.commons.lang.StringEscapeUtils
// tag エスケープ,サニタイズ


// HTMLらしき文字列
String html = "<a href=\"hoge.html\">ほげ</a>";

// HTMLのエスケープ
// マルチバイト文字に対して頑張り過ぎてしまう
String escHtml = StringEscapeUtils.escapeHtml( html );
System.out.println( escHtml );
  //=> &lt;a href=&quot;hoge.html&quot;&gt;&#12411;&#12370;&lt;/a&gt;

// 頑張り過ぎが嫌な場合は、org.apache.commons.lang.Entities.javaの
// 831行目辺りの記述をいい感じに書き換えてJAR作り直すとか
// さらに頑張り過ぎなことをすれば対応できなくはないです

// HTMLのアンエスケープ
String unescHtml = StringEscapeUtils.unescapeHtml( escHtml );
System.out.println( unescHtml );
  //=> <a href="hoge.html">ほげ</a>

// JavaScriptの場合
// これもマルチバイト文字を頑張ってくれます
String js = "\"とか/";
String escJs = StringEscapeUtils.escapeJavaScript( js );
System.out.println( escJs );
  //=> \"\u3068\u304B\/

// unescape
System.out.println( StringEscapeUtils.unescapeJavaScript( escJs ) );
  //=> "とか/

// JavaScriptの頑張りを消したい時も、中の子を書き換える必要があります
// private static void escapeJavaStyleString(Writer, String, boolean)
// この子です。
// privateじゃなければ、継承して直したいところですが。

// XMLもあります
String xml = "<xml version=\"1.0\"><a>ほげ</a>";
String escXml = StringEscapeUtils.escapeXml( xml );
System.out.println( escXml );
  //=> &lt;xml version=&quot;1.0&quot;&gt;&lt;a&gt;&#12411;&#12370;&lt;/a&gt;
String unescXml = StringEscapeUtils.unescapeXml( escXml );
System.out.println( unescXml );
  //=> <xml version="1.0"><a>ほげ</a>