簡単なアクセス解析を作っています。アクセスされると 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 で変換してください。
回答拒否設定の件、ご対応をありがとうございます。
コメントでいただいた質問に対して回答いたします。
2バイト文字がないとエディタで開くと強制的に SJIS となり、確認のしようがありません。
このファイルは UTF-8 ですよ、みたいな検出関数があればいいのですが。
これはエディタ側の問題です。
ファイルの中に半角英数字しかなければASCIIファイルと呼びますが、それはUTF-8(N)とも言えますし、EUC-JPとも言えますし、SJISとも言えます。つまり全角文字のようなマルチバイト文字が加わらない限り、UTF-8(N)/EUC-JP/SJISの識別が発生しないのです。
この状態では、エディタのデフォルト文字コードが何なのかによって、それ以降に入力する全角文字のコードが決まってきます。
PHPのみならず、ASCIIファイルを作成したプログラムで制御できるわけではありません。(純粋なテキストファイルには文字コードを識別するための目印を入れることはできません)
たとえばエディタ「秀丸エディタ」の場合、文字コードの自動判定順位を変更し、UTF-8を最上位にすれば、ASCIIファイルもUTF-8ファイルとして認識されるようになります。
文字コードについて知識がなかったのでこのような質問になってしまったのですね。
半角英数字にも文字コードがあると思っていました。
とても勉強になりました。ありがとうございました。
文字コードについて知識がなかったのでこのような質問になってしまったのですね。
半角英数字にも文字コードがあると思っていました。
とても勉強になりました。ありがとうございました。