Friday, September 28, 2007

vim で文字コードを指定するには?

たとえば次のように設定すればいい。

set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,euc-jp,cp932,latin1

encoding で vim 内部で使う文字コードを指定する。vim 内部とはバッファやレジスタ内の文字列、.viminfo ファイル内のテキストなどに使用されるという意味らしい。

fileencodings ではファイルを読み書きするときに考慮する文字コードのリストを指定する。ファイルを読み出すときに、このリストの順に文字コードを試していき、該当するものがあれば、それを使う。もし、その文字コードが encoding に指定しているものと異なる場合は文字コードの変換がなされるが、書き込むときは元のコードに再変換して書き込まれる。一致するものがリストにないなら encoding の文字コードで読み出される。

ファイル編集時に

set fileencoding?

とすると、ファイルの文字コードと判定された文字コード名が示される。上に書いたことから分かるように、これは fileencodings に指定したリスト内のいずれかになる。リスト内に一致したものがない場合は、この fileencoding は空になる。

fileencodings の設定で、latin1 (ISO_8859-1) を先頭に指定すると、UTF-8 や EUC-JP のファイルでも Latin1 と判定されてしまった。これは、それらのファイル内の少なくとも最初の部分の文字を構成するバイトが Latin1 でコードポイントを与えられているからだろう。

Windows の gvim の設定で(gvimrc ファイル) encoding に CP932 以外を指定すると、メニューなどの文字が文字化けした。冒頭で書いたように、テキストだけではなく vim 内部で使用する文字コードが設定されることが原因だろう。


参考サイト: vim の全オプション

vim の自動インデントで余分にインデントされてしまう件

vim でタブに対応する空白数はデフォルトで8のようだが、ホームディレクトリ直下の .vim ファイルに

set tabstop=4

と定義しておくことで、対応する空白数を4にセットできる。だが、こうすると C や Java のソースファイルを編集するときの自動インデントが余分に入るようになってしまった。つまり、1回インデントして空白が4つ入るはずなのに、2回インデントして8つの空白が入るようになってしまう。

この原因は、タブの空白数の設定と自動インデントによる空白数の設定とは別であるところにある。デフォルトでは自動インデントにおける空白数が8に設定されているようで、このためタブの空白数が4だと、8つの空白を入れるためにインデントが2回実行されてしまうというわけだ。


参考サイト: vim の全オプション


これを直すには、自動インデントの空白数をタブの空白数に合わせてやればいい。次のように設定する。

set shiftwidth=4

.vimrc に先の tabstop の設定と同様に定義しておけば、問題は解決する。

Monday, September 03, 2007

JDBC で SQL の LIKE 文を使うときの書き方

次のように書く。

String keyword = "富";
PreparedStatement st = con.prepareStatement("SELECT name FROM tbl_names WHERE name LIKE ?");
st.setString(1, "%" + keyword);

これにより、富、という文字で始まる名前が検索できる。つまり、LIKE 演算子に使う % や _ などのワイルドカードも含めた検索文字列を setString メソッドで、? にセットするということだ。

ではワイルドカードをエスケープするときは、どうするか?Oracle ではエスケープ文字は特に決まっておらず、ESCAPE オプションで指定する。たとえば、

SELECT id FROM tbl_names WHERE id LIKE '\%%' escape '\';

という SQL 文は、\ をエスケープ文字に指定しており、% という文字で始まる id を検索している。もし、\ がなかったなら、すべての id がヒットする。

JDBC の場合も同様にすればよい。

PreparedStatement st = con.prepareStatement("SELECT id FROM tbl_names WHERE id LIKE ? escape '\\' ");
st.setString(1, "\\%%");

こうすれば、% で始まる id を検索できる。念のため言っておくと、\\ のように二重になっているのは、Java の文字列中では \ はエスケープ文字であるため、二重にすることで \ そのものを表現している。

ただ、このエスケープ文字の指定は Oracle 固有であるので、違う RDBMS では通用しないかもしれない。そこで、JDBC はエスケープ構文が用意している。次のように書く。

PreparedStatement st = con.prepareStatement("SELECT id FROM tbl_names WHERE id LIKE ? escape {'\\'} ");
st.setString(1, "\\%%");

結局、Oracle との違いは、エスケープ文字を {} で囲っていることだけだ。


Oracle、PostgreSQL 等でこれを実験してみる。
そして
http://www.nilab.info/zurazure2/000740.html
このページも参考にしながら、続きを書く。