久しぶりに,PHPのコードをいじりました.
自作のWebアプリケーションで,特定用途のテキストファイルを参照したり,変更したりできるようにしています.変更したら即コミットをします.バージョン管理にはSubversionを用いています.
それで,コミットをするために
$command = "svn commit -m \"$comment\" $filename";
system("$command > /dev/null");
とすると,コミットがうまくいくときといかないときがありました.あれこれ実行したところ,$commentが持つ文字列の中に,日本語文字が含まれていれば,ダメらしいと分かってきました.
ファイルにとってみますか.
$command = "svn commit -m \"$comment\" $filename"; $logfile = "/tmp/logfile.txt"; system("date >> $logfile"); system("echo \"$command\" >> $logfile"); system("$command >> $logfile 2>&1");
それで,また何度か実行してから,/tmp/logfile.txtを見てみると,echoコマンドで$commandの中身を出力してみた際に,文字化けが発生しています.つまりsvn実行以前の問題です.これについては,最初の$commentへの代入の直後に
$comment= mb_convert_encoding($comment, "UTF-8", "auto");
を書くことで解決しました.
しかしそれでも,svn commitはうまくいきません.エラーメッセージの最初2行は
svn: Commit failed (details follow): svn: Can't convert string from native encoding to 'UTF-8':
とあって,あ,これは環境変数を設定すればいいんじゃないかと気づき,コミットのコマンドを
$command = "env LANG=ja_JP.UTF-8 /usr/bin/svn commit -m \"$comment\" $filename";
に変更すると,うまくコミットでき,ログファイルにも文字化けされていない日本語メッセージが追記されるようになりました.
そもそもsystemで実行するのは奥の手のはずです.少し調べると,http://www.php.net/manual/ja/book.svn.phpというページを見つけました.要インストールなので,今のサーバですぐに使えそうにないのですが,システムのアップグレードの際には,これを使えるよう検討したいものです.