Java

Javaで簡易htmlspecialchars

Javaで文字コードを考えてないhtmlspecialcharsを作る

外部ライブラリが使えない環境下でエスケープ処理をする必要が出てきたので書いた。環境はWindowsでJava10

javaにはデフォルト引数が使えないので、ENT_QUOTESとかを文字列の引数で受け取ることに、今後文字コード等を考えていくならオーバーロードして作るのがよさそう。

function
public class Escape{


    /**
        & to &
        " to " if flag.equals("ENT_COMPAT") flag.equals("ENT_QUOTES")
        ' to ' if flag.equals("ENT_QUOTES")
        < to &lt;
        > to &gt;
    */
    public static String htmlspecialchars(String s, String flag){
        String ret = s.replace("&","&amp;").replace("<","&lt;").replace(">","&gt;");
        if(flag.equals("ENT_COMPAT")){
            return ret.replace("\"", "&quot;");
        }else if(flag.equals("ENT_QUOTES")){
            return ret.replace("'", "&apos;").replace("\"","&quot;");
        }else if(flag.equals("ENT_NOQUOTES")){
            return ret;
        }
        return ret;
    }
}

あんまりきれいじゃない、ENT_COMPATENT_QUOTES指定されてなければreturn ret;でいい気がした。

main
public static void main(String[] args){
        System.out.println(htmlspecialchars("<script>alert(\"1\");</script>","ENT_COMPAT"));
        System.out.println(htmlspecialchars("<script>alert(\"1\");</script>","ENT_NOQUOTES"));
        System.out.println(htmlspecialchars("<script>alert('1');</script>","ENT_QUOTES"));
    }
結果
>java Escape
&lt;script&gt;alert(&quot;1&quot;);&lt;/script&gt;
&lt;script&gt;alert("1");&lt;/script&gt;
&lt;script&gt;alert(&apos;1&apos;);&lt;/script&gt;