Filezilla(Linux:euc_jp) のインストール[解決]
(このページは、Linux (特に、locale がeuc_jp)でFilezilla を利用する場合の話です。)
前まので説明は、異なるバージョンでの説明などごちゃごちゃしていたが、整理すると、日本語ファイル名の問題は
- リモートのファイル名に関しては、接続先の文字セットの設定により正常に動作する
- ローカル(この場合ローカル文字セットはeuc-jp)の日本語を含むパス名の表示は、「編集」ー>「設定」ー>「言語」 をJapanese(ja_JP) とすると、パス名の表示の段階で文字化け
- ローカルの文字セットの設定を、「システムの標準言語」とすると、パス名の表示は解決
- だたし、リモートファイルをget する場合、転送されたパス名が文字化け
- さらに、ローカルのファイルをput すると、そのような「ファイルは無い」とし送信できない
これらより、原因は、
- 送られて来たファイルのパス名を、わざわざ utf-8 にコード変更
- 送信する場合は、もともとeuc-jp のパス名を utf-8 に変換してから送信するので、ファイル名が変更されたので該当ファイルが見つからない
であるようだ。
よって対策は、
- get する場合、送られたパス名のコード変更を行わない
- put する場合、文字コードを変更せずに送信する
。
filezilla-3.3.3 のソースファイルを調べ、 src/engine/ のディレクトリのsftpcontrolsocket.cpp において
get の場合
if (!AddToStream(cmd) || !AddToStream(localFile + _T("\n"), true))
{
ResetOperation(FZ_REPLY_ERROR);
return FZ_REPLY_ERROR;
}
のif 部分は、2回ルーチンを呼び出し、1回でもエラーであれば、エラー処理を行うという作業をおこなっている。さらに、AddToStreamは、sftp のコネクションの通信バッファに 文字列(wxString) cmd と localFile+_T("\n") を送るもので、これが通常のsftp の送信の命令になっている。
sftp のコマンドは
get [-P] remote-path [local-path]
put [-P] local-path [remote-path]
実際のcmd の文字列は
cmd = "get " + remoteFilename
であり、if 文の中の2つ目のAddToStreamで[local-path] を指定している。さらに、重要なのは、このAddToStreamの2つ目の引数(上の場合はtrue)は、第1引数をutf-8 に変換するか否かの論理となる(第2引数が無い場合は false )。従って、このままでは、get されたファイルのローカルのパス名がutf-8 になる。
同様に、put の場合は
if (!AddToStream(cmd) || !AddToStream(localFile, true) ||!AddToStream(remoteFile + _T("\n")))
となっており、cmd="put " のみである。ここも、put する際、ローカルのパス名をutf-8 に変換している。
以上より、
$ diff sftpcontrolsocket.cpp~ sftpcontrolsocket.cpp
1841c1841
< if (!AddToStream(cmd) || !AddToStream(localFile + _T("\n"), true))
---
> if (!AddToStream(cmd) || !AddToStream(localFile + _T("\n"), false/*true*/))
1860c1860
< if (!AddToStream(cmd) || !AddToStream(localFile, true) ||
---
> if (!AddToStream(cmd) || !AddToStream(localFile, false /*true*/) ||
とpatch を当ててコンパイルし、動作確認したところ、送信、受信とも問題なく動作した。下のスナップショットは、「PCWHコンパイラーの。。」をローカルからリモートにput した後の画面であり、上側のメッセージログに
状態: local:/home/maeyama/tmp2/PCWHコンパイラのご注文に関しまして2.eml => remote:/home/maeyama/tmp/PCWHコンパイラのご注文に関しまして2.eml
状態: File transfer successful, transferred 3,821 バイト in 1 秒
と送信できたことが表示されている。修正する前は、「状態: local:/」のパス名も文字化けしていた。
なお、filezilla-3.3.3 をbuild する際に、wx-config が見つからない場合(wxWidgetsが当然インストールされている。多分、ソフトリンクの設定がし忘れている)、
/usr/bin/wx-config -> /usr/lib/wx/config/gtk2-unicode-release-2.8*
つまり、
$ ln -s /usr/lib/wx/config/gtk2-unicode-release-2.8 /usr/bin/wx-config
とする。
ライブラリィの関係から、Plamo-4.72 で標準でインストールされているのは
wxWidgets-2.8.8
であり、これが利用できるのは、filezilla-3.1.0 付近(3.1.6 はwxWidgets-2.8.9 以上)
従って、wxWidgetsを変更したくない場合は、下のfilezilla-3.1.0 、比較的新しいバージョンを利用したい場合は、filezilla-3.3.3 および wxWidgets-2.8.12 をインストールする必要がある。
だたし、万が一動作に不具合があっても責任は持たないので、自己責任で。
なお、filezilla-3.1.0 でも、ソースの変更箇所は同じ。また、filezilla 起動時に 下のようなワーニングが表示されるが無視(正しい修正は、このLC_CTYPE でローカルの文字セットの情報を得て、それに従い、utf-8 に変更するのか、否かを判断させるべき。自分はlocale の考え方がいまいち理解できていないので、とりあえず作業はここまで。)。
また、利用に際して、ローカルの文字セットは、「システム標準」、リモートの文字セットは、 「euc_jp」(「euc-jp」では無いのが不思議) とすると、euc-jp <--> euc-jp 間でファイルのパス名を文字化けせずに送受信できる。
注意
- wxWidgets-2.8.12 をインストールすると、他のプログラムの動作に影響する。これまでに影響があったのは、gnuplot(ライブラリーが一部無いなどで、動作しない。再コンパイルすることで対処)
- filezilla-3.1.0 での sftp 接続では、転送が非常に遅くなるようです。手動でのsftp や scp での速度に比べ、filezilla-3.1.0 では1/100 以下に速度が落ちた。filezilla-3.3.3 では速度低下はあるとしても、極わずかか、分からない。(同一のPCで2つのバージョンを動作比較しても結果は同じ。)