文字列を%形式にエスケープする。
文字列を「%<16進数>」形式にエスケープする関数を書きました。「%<16進数>」形式はURLエンコードで使われるエスケープの方式です。URLエンコードではaとかbとかURLで使える文字列をエスケープする必要はありませんが、この関数はすべての文字列を容赦なくエスケープします。
/** * 「%16進数」形式にエスケープする。 * @param string エスケープする文字列 * @param encode 文字列のエンコード * @return エスケープした文字列 * @throws UnsupportedEncodingException 文字列のエンコードが不正な場合 */ public static final String escape( String string, String encode ) throws UnsupportedEncodingException { StringBuffer buff = new StringBuffer(); byte[] b = string.getBytes( encode ); for ( int i = 0; i < b.length; i++ ) { buff.append( "%").append( String.format("%1$02X", b[i]) ); } return buff.toString(); }
サンプル。
System.out.println( "a : " + escape( "a", "UTF-8" ) ); System.out.println( "あ : " + escape( "あ", "UTF-8" ) ); System.out.println( "あ : " + escape( "あ", "SJIS" ) ); System.out.println( "# : " + escape( "#", "UTF-8" ) ); System.out.println( " : " + escape( " ", "UTF-8" ) ); System.out.println( "\\t : " + escape( "\t", "UTF-8" ) );
実行結果です。
a : %61 あ : %E3%81%82 あ : %82%A0 # : %23 : %20 \t : %09
修正 (2008-01-09)
bleis-tift さんからトラックバックでつっこんで頂いた点を修正(とりあえず明らかなバグだけ)
- "\t"を変換すると、"%9"とかになる。
- →1桁になる場合を考慮してなかった・・・。orz. 愚かすぎる。ということでフォーマットを"%1$02X"に修正。
他にもいろいろご指摘いただきました。参考になります。ありがとうございました。