Skip to content

Instantly share code, notes, and snippets.

@taichi
Forked from seyan/EscapeHtmlTest.java
Created March 28, 2011 07:55
Show Gist options
  • Save taichi/890130 to your computer and use it in GitHub Desktop.
Save taichi/890130 to your computer and use it in GitHub Desktop.
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class EscapeHtmlTest {
/**
* 引数で与えられた文字列にHTMLエスケープを行った結果文字列を返す
*
* @param str
* @return
*/
private static String escapeHTML(String str) {
if (str == null) {
return null;
}
// J2SE1.5以降なら、同期処理の無いStringBuilderを使う。
// StringBuilderは、初期化サイズが16だが小さすぎるので、入力の2倍とる。
StringBuilder sb = new StringBuilder(str.length() * 2);
// エスケープの対象サイズを確定する事で、余分なエラーチェックの回数を減らす。
char[] ary = str.toCharArray();
for (int i = 0, length = ary.length; i < length; i++) {
char c = ary[i];
if (c == ' ') { // 半角スペース
sb.append("&nbsp;");
} else if (c == '\u00A5') { // ¥サイン
sb.append("&yen;");
} else if (c == '<') {
sb.append("&lt;");
} else if (c == '>') {
sb.append("&gt;");
} else if (c == '&') {
sb.append("&amp;");
} else if (c == '"') {
sb.append("&quot;");
} else if (c == '\'') {
sb.append("&#39;");
} else {
sb.append(c);
}
}
return sb.toString();
}
@Test
public void testEscapeHTML() throws Exception {
assertEquals(escapeHTML("abcdefg"), "abcdefg");
assertEquals(escapeHTML("試験テスト"), "試験テスト");
assertEquals(
escapeHTML("<script>alert('test');</script>&url=http://test"),
"&lt;script&gt;alert(&#39;test&#39;);&lt;/script&gt;&amp;url=http://test");
assertEquals(escapeHTML("hoge fuga"), "hoge&nbsp;fuga");
assertEquals(escapeHTML("hoge\u00A5fuga"), "hoge&yen;fuga");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment