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つのバージョンを動作比較しても結果は同じ。)