簡単なアクセス解析を作っています。アクセスされると 20100617.dat のような日付とリンクした名前のファイルが作られ、記録されます。
サイト自体の文字コードを UTF-8N で作成している関係で、上記の 20100617.dat も UTF-8N で作られることを期待していますが、記録された文字の中に2バイト文字が含まれていないと、エディタなどで開く時に SJIS になってしまうことが多いと思います。mb_detect_encoding 等の関数もありますが、バグがあるとかで、正常動作が期待できないようです。
そこで、fopen 時に文字コードを指定する方法、または作成されたファイルをプログラム上で UTF-8N 保存する方法をご教授下さい。
回答拒否設定の件、ご対応をありがとうございます。
コメントでいただいた質問に対して回答いたします。
2バイト文字がないとエディタで開くと強制的に SJIS となり、確認のしようがありません。
このファイルは UTF-8 ですよ、みたいな検出関数があればいいのですが。
これはエディタ側の問題です。
ファイルの中に半角英数字しかなければASCIIファイルと呼びますが、それはUTF-8(N)とも言えますし、EUC-JPとも言えますし、SJISとも言えます。つまり全角文字のようなマルチバイト文字が加わらない限り、UTF-8(N)/EUC-JP/SJISの識別が発生しないのです。
この状態では、エディタのデフォルト文字コードが何なのかによって、それ以降に入力する全角文字のコードが決まってきます。
PHPのみならず、ASCIIファイルを作成したプログラムで制御できるわけではありません。(純粋なテキストファイルには文字コードを識別するための目印を入れることはできません)
たとえばエディタ「秀丸エディタ」の場合、文字コードの自動判定順位を変更し、UTF-8を最上位にすれば、ASCIIファイルもUTF-8ファイルとして認識されるようになります。
UTF8 は ASCII と互換があるため、半角英数文字だけでは UTF8 と認識できないのが普通の動作です。
ASCII のみのファイルにマルチバイト文字を追加で出力すれば、エディタは勝手に UTF8 と認識されます。
ただ短すぎる文字列では検出失敗するので、十数文字ぐらいは出力してあげた方がいいかも知れません。
PHP は OPEN 時に文字コードを指定できないので、読み取り後に
mb_convert_encoding で変換してください。
もしよろしければご回答下さい。
しかし回答できませんでした。
ということは、私は1ヶ月に20名以上から回答拒否されているのですね(涙;
回答内容を記しておきます――
UTF-8Nというのは、おそらく日本での俗称で、UTF-8と同じ意味です。
PHPで扱う場合は、スクリプトの冒頭や fopen 関数の直前で
mb_internal_encoding('utf-8');
を指定すれば、内部処理は UTF-8 で、ファイルに保存される形式も UTF-8 になります。
こういうこともあるのかと、「拒否しない」に設定し直しました。
拒否した理由が書かれているといいですよね。自分のことではありませんが、軽くショックでした。
上記回答いただきましたが、2バイト文字がないとエディタで開くと強制的に SJIS となり、確認のしようがありません。
このファイルは UTF-8 ですよ、みたいな検出関数があればいいのですが。
2バイト文字が含まれない場合、システムデフォルトの文字コードで開くエディタがほとんどなのだと思います。
※設定で、デフォルトの文字コードを変更できるエディタもあります。