内部文字コードをUTF-8に設定し、CSV処理のプログラムを開発していたのですが、fgetcsv()関数で半角カタカナが取得できない現象ではまってしまいました。
対応策を備忘録として残しておきます。
PHPマニュアルには以下の記載があります。
via PHP Manual
getcsv — ファイルポインタから行を取得し、CSVフィールドを処理する
注意: この関数はロケール設定を考慮します。もし LANG が例えば en_US.UTF-8 の場合、 ファイル中の 1 バイトエンコーディングは間違って読み込まれます。
なので、プログラム内でロケールの設定をします。
ロケールの設定はsetlocale()関数で行うことができます。
via PHP Manual
setlocale — ロケール情報を設定する
CSV処理の前に下記のようにロケールを日本語の設定にすると、fgetcsv()関数が正常動作できます。
//setlocale -- ロケール情報をセットする
setlocale(LC_ALL, 'ja_JP.UTF-8');
// CSV処理
$handle = fopen("test.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
……
追記[2008.02.06]:
最初の公開時
setlocale(LC_ALL, 'ja_JP.');
としていましたが
setlocale(LC_ALL, 'ja_JP.UTF-8');
の方がより正しいと判明しましたので訂正します。