2008年02月29日

fgetcsv()で日本語が入っているフィールドが正しく読み込まれない件その2

以前こんなのを書いていました。
fgetcsv()で日本語が入っているフィールドが正しく読み込まれない件
で、マニュアルには
注意: この関数はロケール設定を考慮します。もし LANG が例えば en_US.UTF-8 の場合、 ファイル中の 1 バイトエンコーディングは間違って読み込まれます。
とあります。
Webを検索すると、ロケールを設定すれば日本語も読めるようになるという記述も見られますが、WindowsでUTF-8のcsvファイルは読めないようです。

Windowsなのでロケール設定はこんなにして書きます。
setlocale(LC_ALL, "japanese_japan");

で、どうなったか確認してみると、
setlocale(LC_ALL, "0");
-> Japanese_Japan.932

最後の「932」はコードページで「Shift_JIS」になります。
http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932
じゃあこれをUTF-8にしちゃえ!と思って、
setlocale(LC_ALL, "japanese_japan.UTF-8");

とか、
setlocale(LC_ALL, "japanese_japan.65001");

とかしても、
setlocale(LC_ALL, "0");
-> LC_COLLATE=C;
LC_CTYPE=Japanese_Japan.932;
LC_MONETARY=C;
LC_NUMERIC=C;
LC_TIME=C"
と、LC_CTYPEは932のままです。
fget_csvに影響があるのはLC_CTYPEのようなのでこれではダメですね。
マニュアルのsetlocaleから、
LC_CTYPE 文字の分類と変換。たとえば strtoupper()


ちなみに、一度オランダ語に設定してから、上記を実行すると、

setlocale(LC_ALL, "nld_nld");
setlocale(LC_ALL, "japanese_japan.65001");
setlocale(LC_ALL, "0");
-> LC_COLLATE=Japanese_Japan.65001;
LC_CTYPE=Dutch_Netherlands.1252;
LC_MONETARY=Japanese_Japan.65001;
LC_NUMERIC=Japanese_Japan.65001;
LC_TIME=Japanese_Japan.65001

と、LC_CTYPEだけオランダ語のままという、妙な事になります。
posted by ほえ at 12:49| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。