Web Artisan Blog - ウェブ アルチザン ブログ

FTP:アスキー、バイナリモード転送:EUC変換って?

PHP

2004年11月04日

Research Artisan Pro ←リサーチアルチザンがパワーアップして復活しました!!
phpのTipsではないですが、Unix系サーバーに絡むファイル転送について。

ぶっちゃげ、Windows畑で育ってきた私にとって、文字コード変換とか苦手です。。
ASP開発なんかでも、開発しているクライアント端末、
動いているWEBサーバー共にWindows環境(IISサーバーの場合)であれば、
こんな文字コードとか考えなくていいんです。。

しかし、やはり安定して動くサーバーといえばUnix系。
そのサーバーに対して、PHPなんかをFTPでファイル転送する際に、
ついついいつもの調子で、ぽけーっとしていると、
クライアントとサーバーの文字コードが違うんで、全然動かなかったりします・・。
そこで、これらについて、改めて簡単にまとめてみよっと。。
■2つの転送モードについて(アスキーモードとバイナリーモード)

・アスキーモード
  ファイルの改行コードを変換してアップロードする。
・バイナリモード
  ファイルの改行コードを変換せず、そのままアップロードする。

両者の違いは、一言で言うと上記のようになるでしょうか。

つまり、アスキーモードで転送すべきファイルは、テキスト形式で構成されるファイルとなります。
ファイル種類で言えば、”.txt”や”.log”のようなテキストファイルや、
”.html”や”.css”といったHTMLに絡むファイル、”.cgi”、”.php”等のスクリプトファイル。
要は、テキストベースで扱われたり、実行されたりするファイルは、これにあたります。

逆に、バイナリモードで転送すべきファイルは、
”.jpg”、”.gif”等の画像ファイルや、”.zip”等の圧縮ファイル。
要は、テキストエディタで見ても何のこっちゃわからんが、
それぞれ見たり使用するソフト等で、動作したり扱う事ができる、
「実行形式のファイル」がこれにあたります。

この事から、FTP転送を行うときには、
ファイルの種類によって、正しく転送モードを指定しないといけません。
”.php”や”.pl”等のスクリプト形式のプログラムは、アスキーモードで転送するのが基本です。
でないと、プログラムがうまく動きませんからね。。

何でうまく動かないかというと、改行コードが変だと、
それぞれのスクリプトの記述が変に取られて動かない可能性があるのです。
例えば、PHPであれば、各命令の末尾、すなわち改行は”;(セミコロン)”で区切られます。
これであれば、PHPが解析され実行される時に、変な取られ方はしません。
しかし、改行自体が”改行”として取られるような記述。
例えば、CGI版PHPを作成した時の、1行目の記述
「#!/usr/local/bin/php」
なんかは、アスキーモードで改行されないと、改行してしてないと認識され、
この記述は2行目の「<?php」以降、延々と1行目とみなされます。
ってなると、
”Error Message: No such file or directory ”みたいなエラーとなって、
「#!/usr/local/bin/php」のパスが見つからないってな、おかしなエラーとなるのです。



FTP転送するには、”FFFTP”といったソフトを使うのが一般的で、
それらには、転送モードを指定する事ができます。
ファイルの種類毎に、転送モードを指定すれば確実かもしれませんが、
それも面倒くさいので、大概のソフトには”自動切換機能”がついてます。
まあ、それ自体の設定はしないといけないので、
アスキーコードで転送するべき、ファイルの拡張子を指定する事になるでしょう。
”FFFTP”では、”.cgi”や”.pl”はデフォルトで指定されてるので、
意識せずとも、これらのファイルはアスキーモードで転送されます。
しかし、”.php”はデフォルトでは入ってなさそうです。。
一応確認して、なければ設定します。


■サーバー転送時のEUC変換

大概のレンタルサーバーの文字コードは、EUCだと思われます。
Unix系のレンタルサーバーが多いのは、Unixがそれだけ安定して動くからです。

私のようにWindowsのPCを使っている人が、
上記で言うテキスト形式のファイルを、EUCベースのサーバーに転送する際は、
EUCに変換して転送するのが基本です。
この機能は、”FFFTP”を始めとするFTPソフトに付いていますので、
”EUC変換”の形で転送すれば、FTPソフトが勝手にEUCに変換してくれます。

これをしないと、特に”.php”や”.cgi”、”.pl”等のスクリプト系プログラムは、
またまたうまく動作してくれません。


■その他

一応、上記の事を理解していれば、クライアントとサーバーの文字コードが違っても、
うまく対応する事ができます。
上記2つのモードは大雑把に、
”アスキーモードは何か勝手に変換してくれる”
”バイナリモードは何もせんと、ファイルの内容そのままで転送してくれる”
と覚えていればいいのではないでしょうか。

場合によっては、”.php”等のスクリプトファイルを、
変換せずにそのまま転送したい場合も起こりうります。
例えば、サーバーのスクリプトファイルを修正しようと転送してきたが、
文字化けして見れなかった場合。
それがEUCのファイルであれば、バイナリーモードでそのファイルをクライアントに転送し、
EUCの文字コードを読めるエディタで修正。
それを、そのままバイナリモードでサーバに転送すれば、修正は反映され正しく動作します。