UTF-8鯖なんて嫌いだ!

エクセルで出力したCSVファイルとMySQLを利用したPHPプログラムを作ってました。
始めはデフォルト文字コードがShift-JISの鯖で開発。
この時点では問題なく動いてました。


で、途中からUTF-8の本チャンの鯖に移すことに。
で、問題発生。
UTF-8上だと、エクセルが吐いたShift-JISのCSVファイルをfgetcsvで読み込むと文字化けに!しかも、なにも考えずMySQLと通信しようとすると文字化け!


MySQLは送受信するデータをそのつどmb_convert_encodingにて文字コードを変換していたんだけれども、上手くいかず。
で、色々調べたところ、MySQLとの通信を強制的に任意の文字コードに指定できる方法があるそうです。
$conn = mysql_connect("サーバ" , "ユーザ" , "パス");
$rtn = mysql_query("SET NAMES utf8" , $conn);
これで通信時の文字コードUTF-8に指定できます。
あとは、表示するときにmb_convert_encodingなどで文字コードを好みのものに変換してやればめでたしめでたし。


問題は、fgetcsvだった。
こいつが曲者で、SJISのファイルを(PHPがどの文字コードで書かれていても)開くと「アフター」などが、「Aフター」などに化ける。
「フター」部分は表示できてるのでまんざら文字コードを認識できてないわけではなさそうだ。が、htaccessで何を指定しようと、ini_setで色々設定しようと直らず。鯖の設定は権限がないんで変更できなし。
で、いろいろ試していたらどうもfgetsは正常に動作するようだ。
なんで、逃げることに。
まず、csv(SJIS)をfgetsで開き、それをmb_convert_encodingでEUCに変換して別のcsv(euc)に保存する。
こんなんでいいのかしら。


以下使用したプログラム(抜粋)
$file1 = fopen($new_file, "w");
fputs($file1,"");
fclose($file1);
$file1 = fopen($new_file, "a");
$file2 = fopen($src_file, "r");
while(!feof($file2)){
$string = fgets($file2,2048);
fputs($file1, mb_convert_encoding($string, "EUC","SJIS"));
}
fclose($file2);
fclose($file1);


・・・ひどいなぁ