PHP fopen(url,"a")の質問です。

簡単なアクセス解析を作っています。アクセスされると 20100617.dat のような日付とリンクした名前のファイルが作られ、記録されます。
サイト自体の文字コードを UTF-8N で作成している関係で、上記の 20100617.dat も UTF-8N で作られることを期待していますが、記録された文字の中に2バイト文字が含まれていないと、エディタなどで開く時に SJIS になってしまうことが多いと思います。mb_detect_encoding 等の関数もありますが、バグがあるとかで、正常動作が期待できないようです。

そこで、fopen 時に文字コードを指定する方法、または作成されたファイルをプログラム上で UTF-8N 保存する方法をご教授下さい。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/06/18 17:41:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Bombastus No.3

回答回数409ベストアンサー獲得回数52

ポイント100pt

回答拒否設定の件、ご対応をありがとうございます。

コメントでいただいた質問に対して回答いたします。

2バイト文字がないとエディタで開くと強制的に SJIS となり、確認のしようがありません。

このファイルは UTF-8 ですよ、みたいな検出関数があればいいのですが。

これはエディタ側の問題です。


ファイルの中に半角英数字しかなければASCIIファイルと呼びますが、それはUTF-8(N)とも言えますし、EUC-JPとも言えますし、SJISとも言えます。つまり全角文字のようなマルチバイト文字が加わらない限り、UTF-8(N)/EUC-JP/SJISの識別が発生しないのです。

この状態では、エディタのデフォルト文字コードが何なのかによって、それ以降に入力する全角文字のコードが決まってきます。

PHPのみならず、ASCIIファイルを作成したプログラムで制御できるわけではありません。(純粋なテキストファイルには文字コードを識別するための目印を入れることはできません)


たとえばエディタ「秀丸エディタ」の場合、文字コードの自動判定順位を変更し、UTF-8を最上位にすれば、ASCIIファイルもUTF-8ファイルとして認識されるようになります。

id:AKI-NAMI

文字コードについて知識がなかったのでこのような質問になってしまったのですね。

半角英数字にも文字コードがあると思っていました。

とても勉強になりました。ありがとうございました。

2010/06/18 17:39:54

その他の回答2件)

id:niwa-mikiho No.1

回答回数516ベストアンサー獲得回数40

ポイント100pt

UTF8 は ASCII と互換があるため、半角英数文字だけでは UTF8 と認識できないのが普通の動作です。

ASCII のみのファイルにマルチバイト文字を追加で出力すれば、エディタは勝手に UTF8 と認識されます。



ただ短すぎる文字列では検出失敗するので、十数文字ぐらいは出力してあげた方がいいかも知れません。



PHP は OPEN 時に文字コードを指定できないので、読み取り後に

mb_convert_encoding で変換してください。

id:hanako393 No.2

回答回数1142ベストアンサー獲得回数87

全角空白文字も出力しておけばOKです。

id:AKI-NAMI

この質問の趣旨とは違う、と思います。(素人なので、回答の内容を性格に把握してないかもしれません)

2010/06/18 13:57:14
id:Bombastus No.3

回答回数409ベストアンサー獲得回数52ここでベストアンサー

ポイント100pt

回答拒否設定の件、ご対応をありがとうございます。

コメントでいただいた質問に対して回答いたします。

2バイト文字がないとエディタで開くと強制的に SJIS となり、確認のしようがありません。

このファイルは UTF-8 ですよ、みたいな検出関数があればいいのですが。

これはエディタ側の問題です。


ファイルの中に半角英数字しかなければASCIIファイルと呼びますが、それはUTF-8(N)とも言えますし、EUC-JPとも言えますし、SJISとも言えます。つまり全角文字のようなマルチバイト文字が加わらない限り、UTF-8(N)/EUC-JP/SJISの識別が発生しないのです。

この状態では、エディタのデフォルト文字コードが何なのかによって、それ以降に入力する全角文字のコードが決まってきます。

PHPのみならず、ASCIIファイルを作成したプログラムで制御できるわけではありません。(純粋なテキストファイルには文字コードを識別するための目印を入れることはできません)


たとえばエディタ「秀丸エディタ」の場合、文字コードの自動判定順位を変更し、UTF-8を最上位にすれば、ASCIIファイルもUTF-8ファイルとして認識されるようになります。

id:AKI-NAMI

文字コードについて知識がなかったのでこのような質問になってしまったのですね。

半角英数字にも文字コードがあると思っていました。

とても勉強になりました。ありがとうございました。

2010/06/18 17:39:54
  • id:Bombastus
    方法は分かるのですが、回答拒否されているようなので、残念ながら回答できません。
  • id:AKI-NAMI
    1ヶ月に10名以上から回答拒否を受けている、ということになります。とりあえず、20名以上、に変更しました。
    もしよろしければご回答下さい。
  • id:Bombastus
    ご対応ありがとうございます。
    しかし回答できませんでした。
    ということは、私は1ヶ月に20名以上から回答拒否されているのですね(涙;

    回答内容を記しておきます――
    UTF-8Nというのは、おそらく日本での俗称で、UTF-8と同じ意味です。
    PHPで扱う場合は、スクリプトの冒頭や fopen 関数の直前で
    mb_internal_encoding('utf-8');
    を指定すれば、内部処理は UTF-8 で、ファイルに保存される形式も UTF-8 になります。
  • id:AKI-NAMI
    私が見た限りの Bombastus さんの回答履歴では拒否する理由がありません。
    こういうこともあるのかと、「拒否しない」に設定し直しました。
    拒否した理由が書かれているといいですよね。自分のことではありませんが、軽くショックでした。

    上記回答いただきましたが、2バイト文字がないとエディタで開くと強制的に SJIS となり、確認のしようがありません。
    このファイルは UTF-8 ですよ、みたいな検出関数があればいいのですが。
  • id:rouge_2008
    エディタで開く場合の事ですが、WindowsではSJISで、Linux系のOSではUTF-8で開かれます。
    2バイト文字が含まれない場合、システムデフォルトの文字コードで開くエディタがほとんどなのだと思います。
    ※設定で、デフォルトの文字コードを変更できるエディタもあります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません