少しもやもやしていたものの、なんとなくやり過ごしていたことをまとめます。2つ。
■ daemonのスタートアップメッセージが文字化けする
Jan 27 10:22:33 MY-SERVER proftpd[2646]: 192.168.1.x - ProFTPD 1.3.5a (maint) (built 餉-^GM-^Q 1覡-^\M-^H 15 2016 03:58:37 JST) standalone mode STARTUP-
ウチはstandaloneモードで使っています。
cat /var/log/messages | grep proftpd
とすると、立ち上げ時にこのような文字化けを起こしています。
原因はmake時のロケールの関係で、dateコマンドの出力に日本語が入っているから。
なので、make時のロケール、特にdateコマンドに使うロケール変数を一時的に書き換えます。
make LC_TIME=C install clean
こうすると、
Jan 27 20:55:33 MY-SERVER proftpd[79020]: 192.168.1.x - ProFTPD 1.3.5a (maint) (built Wed Jan 27 2016 16:52:19 JST) standalone mode STARTUP-
はい、綺麗になりました。
■ UseEncodingについて
mod_codeconvが既に役目を終えて久しいですが、「じゃあUseEncodingで今まで通りにするにはどう書けば良いの?」という疑問。
正しい答えはコレです。
UseEncoding UTF-8 CP932 strict
サーバ上のファイル名は UTF-8
クライアントで扱うファイル名は CP932
という前提になります。
場合分けして説明します。
/// UseEncoding off
→OPTS UTF8 ON/OFFを受け付けず、かつ一切の文字コード変換は行わない
サーバとクライアントがUTF-8とUTF-8でやり取りする場合はこれが適していると思われます。
メッセージの応答もUTF-8同士、ファイル名もUTF-8同士という形です。
/// UseEncoding UTF-8 CP932
→OPTS UTF8 ON/OFFを受け付けつつ、文字コード変換を行う
【OPTS UTF8 ON とは何か】
クライアント「UTF-8使いたいンゴ〜ONにするで」
※RFC2640により、FTPdはUTF-8での応答機能を実装する義務があります
サーバ「ほな1回接続200万円な」
クライアント「はい200万円」
※OPTS UTF8に対する応答コードは200番です(サーバが200を返すので本当は逆です)
サーバ「以後CP932に変換せずにUTF-8で全部送るからよろしくやで」
クライアント「今回だけやぞ」
※本セッション中はずっとUTF-8で対話が行われます。クライアントはUTF-8で送られる応答をすべて文字化けせずに表示出来る準備をします。
こういう感じです。
つまり、UTF-8 CP932とせっかく書いた部分は無視されます。
しかしクライアント側で対応出来るということなので通常は問題ありません。通常は。
しかし通常じゃない挙動をするクライアントがいますそれがInternetExplorerとExplorerのFTPフォルダビューです。
自分からOPTS UTF8 ONを送ったのにも関わらず、堂々と文字化けして表示するんですね。
InternetExplorerの場合は適当な所を右クリック、メニューから「エンコード>Unicode(UTF-8)」を選択すればファイル名の文字化けは直ります。
しかし画像のように別の場所が文字化けしてしまいます。
これに対応する設定が以下になります。
/// UseEncoding UTF-8 CP932 strict
→OPTS UTF8 ONを無視して、設定された通りのエンコードを行う
この設定を行うことで昔のmod_codeconvで設定していた
CharsetLocal UTF-8
CharsetRemote CP932
と同様の効果を得られました。
※2枚目の画像はこの設定をすることで得られた正常な表示です
ログインしてコメントを確認・投稿する