ひとりごと

新しい記事:[2307]  古い記事:[2305] 表示単位 :

ついったー[おとなり日記] かがみさん Y.Kumagaiさん

2008/10/19 (日)

・ 漢字コード

ちょっと思うところがあって漢字コードの大移動を行ってました。うちの漢字コードは

という感じで決めていたのですが、最近はトラックバックやらXML読み込みやらで UTF8 を使う機会がでてきて、ややこしくって仕方がありません。ということで、内部コードやらPostgreSQLのコードはUTF8にしても問題なさそうなので漢字コードを切り替えてみるよう大作戦。かなり面倒くさい作業なのですが、すべての野望を達成したあかつきには「PHPでファイルの読み込み時も出力時も変換の必要がなくなる」とか「ls で普通に漢字のファイル名が表示されるようになる」ということでメリットは計り知れません。

てことで移行スケジュール

Phase 1) WWWの表示を UTF8 にする
PHPの mbstring.http_output を UTF-8 に変更する
Phase 2) PostgreSQLの漢字コードを UTF-8 にする
データベース単位でも設定できるので、範囲外コードの問題がなければ
% pg_dump table_name >hoge ; dropdb table_name ; createdb --encoding utf8 ; psql table_name <hoge
でOK。
Phase 3) UTF8をいじくれるツールを準備
表示は lv、編集は vim を使えば良いようです。
.cshrcに
alias vi vim
alias less lv
setenv PAGER lv
setenv LV '-Ou8'
.vimrcに
set encoding=utf-8
set fileencodings=utf-8,euc-jp,iso-2022-jp,ucs2le,ucs-2,cp932
などと書いておくと吉。
Phase 4) tcsh での漢字コードを UTF-8 にする
.cshrc で setenv LC_CTYPE ja_JP.UTF-8
Phase 5) EUCで書いてるPHPコードをことごとく UTF-8 に直す
vimで開いて ':set filencoding=utf8' してから保存。開いたときに化けてる時は ':e ++enc=漢字コード' と入れてから ^L すれば直る。 ただ、何らかの理由でデータベースの漢字コードとPHPの内部コードが異なる状態になる場合は pg_connect()の後でpg_set_client_encoding() の設定が必要。
Phase 6) sambaの漢字コードをUTF8に変更
既存ファイルのファイル名を変更後、sambaの設定をUTF-8にする。/usr/ports/converters/convmv を使えば簡単。
% cd hoge
% convmv -r -f sjis -t utf8 ./
にて再帰的にファイル名を変更可能かチェックしてくれるので、問題なさそうなら最後の行に --notest を追加して変更を実行する。うちのファイルは 以前 tar でバックアップ/リストアした際になぜか日本語のファイル名がぜんぶ化けてたので大変でした(笑)。その後 smb.conf で
display charset = UTF-8 unix charset = UTF-8 dos charset = CP932
すればOK。
Phase 7) mount_smbfs でマウントしている漢字コードの変更 ←いまここ
最後に、深夜アニメ記録用にWindowsのネットワークドライブをマウントしているので、これの漢字コードをSJISからUTF8に変更・・・しようとしたのですが、うまくいきません。mount_smbfs に -E オプションを付加して -E utf8:cp932 と書くはずなのですが、これを書いても変換してくれません。 -E euc-jp:cp932 だと動くんですけどね。

ということで、結構時間がかかったのですがなんとか終了しました。最後の項目は実現しませんでしたが、できたところでファイルの中身がシフトJISなのは変わらないので(笑)さほど切実な問題でもないかもしれません。

移行作業中は文字化けしてるのが見えてたりPHPのエラー画面が表示されてたりと見苦しいところをお見せしたかもです。まだ見苦しいところがあればきっと変更し忘れですのでこっそり教えてもらえるとたすかります。

□ 関連記事

[つっこみ]

新しい記事:[2307]  古い記事:[2305] 表示単位 :
※このページへのリンクは自由です。リンクの方法については[つっこみ]で表示されるページの最後をごらんください。
たかたに(takatani@mars.dti.ne.jp)