UTF-16LEで改行あたりが勝手に変換される

MD5ハッシュ値を返すmd5関数とmd5_file関数。前者は引数としてハッシュ化したい文字列を受け、後者は引数としてハッシュ化したいファイルのパスを受ける。ここまではマニュアル通り。

とある仕事で、「UTF-16LE」のファイルをPHPで取り扱う際に、うまくいかない問題が生じている。「UTF-16LE」を使うのには理由があって、ファイルをエクセルでそのまま扱いたいからだ(エクセルで編集してアップロード、ダウンロードしてエクセルで編集)。

開発環境で用意したスクリプトを本番環境に移設してテストするのだが、これがなんともうまく動作しない。いろいろ探ったのだが、どうもそのサーバでは「UTF-16LE」で記述されたファイルをPHPで読み込むと、どういうわけか改行コード付近を勝手に変換しているように見受けられる。単にfile_get_contentsしているだけなのに!。

自分で借りているレンタルサーバ、VPS、自分のMacで、file_get_contentsした値をbin2hexして出力してみると、そのサーバでだけ値が異なってしまう。ひょっとしてサーバへの転送の時点で何らかの変換がかかっているのかも、と思ってサーバにあるファイルに対してmd5_file関数でハッシュを取るとそれは全て同じ値が返ってくる。つまりテストしているファイルは同じファイルであることに間違いはない。

そして冒頭のmd5。file_get_contentsした値に対してmd5すると当然md5_fileとおなじになるはずなのに・・・そのサーバだけ違う値。つまりmd5した結果とmd5_fileした結果が異なる値になっている。

いろいろ調べて、文字コードが「UTF-8」の場合は、そのサーバでも事象が発生しなかった。さーどうしようか。サーバ会社に文句を言えばいいのだが、たいていは「プログラムに問題があるんじゃないですか」で終わってしまう(既に別件で適当な嘘を疲れているのでこのサーバ会社は一切信用出来ない)。PHP5.2系の問題である可能性も捨て切れない。もうちょっと悩んでからクライアントに相談することにする。

コメントを残す


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net