(続) Oracle での文字化け対策
とりあえず、以下のような方法で大丈夫そう.
#素直に DB 側で JIS16SJISTILDE を使えれば何もしなくてもいいんだが…
OracleResultSet, OracleResultSetFactory を用意し,どっかの DI に以下を記述する
<component class="example.OracleResultSetFactory"> <initMethod> @org.seasar.extension.jdbc.impl.BasicSelectHandler@register(#self) </initMethod> </component>
OracleResultSet, OracleResultSetFactory は以下のような単純なもの
package example; import java.sql.ResultSet; import java.sql.SQLException; import org.seasar.extension.jdbc.impl.ResultSetWrapper; public class OracleResultSet extends ResultSetWrapper { private static final int WAVE_DASH = 0x301c; private static final int FULLWIDTH_TILDE = 0xff5e; public OracleResultSet(ResultSet resultSet) { super(resultSet); } public String getString(int columnIndex) throws SQLException { return convert(super.getString(columnIndex)); } public String getString(String columnName) throws SQLException { return convert(super.getString(columnName)); } private String convert(String source) { StringBuffer result = new StringBuffer(); char ch; for (int i = 0; i < source.length(); i++) { ch = source.charAt(i); switch (ch) { case WAVE_DASH: // 〜 WAVE DASH -> FULLWIDTH TILDE ch = FULLWIDTH_TILDE; break; default: break; } result.append(ch); } return result.toString(); } }
OracleResultSetFactory
package example; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.seasar.extension.jdbc.impl.BasicResultSetFactory; public class OracleResultSetFactory extends BasicResultSetFactory { public ResultSet createResultSet(PreparedStatement ps) { return new OracleResultSet(super.createResultSet(ps)); } }