dポイントプレゼントキャンペーン実施中!

言語はphpです。

アップロードしたファイルをからデータを1行ずつ抜き取るという作業をしています。
その際にエンコードを下記の方法で行っています。

$lines = mb_convert_encoding(fgets($fp), 'utf-8','shift-jis');

この場合、元のファイルがshift-jisであればなんら問題は無いのですが、すべてのファイルがそうとは限りません。なので、アップロードしたファイルの文字コードを調べ、その文字コードを記述するようにしたいのですが、調べる方法は何か無いでしょうか?


※[auto]を試してみましたが、その際は文字化けが起きていましましたので、出来れば他の方法でお願いします。

自分なりに調べてみましたが、良い情報を見つけることが出来なかったので、ご存知の方は宜しくお願い致します。

A 回答 (3件)

ファイルの文字コード統一については、運用周りやユーザ教育で徹底するのが今後のためになります。

しかし、どうしてもプログラム側で対処しなければならないのであれば。
たいていのLinuxにはnkfというコマンドが付随しています(無ければ追加でインストール可能)
nkfは文字コード推測及び変換ツールです。
nkf -g ファイル名
にてかなりの正解率で文字コードを推測するのでこれをphpから呼び出すという手です。

参考URLに書いてある通りなのですが、かいつまんで解説すると。
function file_charset ($charset_file_path, $char_set) {
という関数を定義。その関数のなかで
$default_charset = `nkf -g $charset_file_path`;
のように、nkfにファイルの文字コードを判別させて返り値を取得
そして
$file_contents = mb_convert_encoding($file_contents, $char_set, $default_charset);
のように、nkf推測文字コードと出力文字コードを指定してmb_convert_encodingで文字コード変換

てな感じです。

別解:ファイルアップロード成功後、「nkf -w ファイル名」コマンドを実行するようプログラムして強制的にUTF-8に上書き変換、という手もありますね。
参考URLが理解できればこの方法でも組めるようになるでしょう。
お好みで好きな方で。
私だったらこっちにするかな。

参考URL:http://www.omnioo.com/omnioolab/php/post-93.php
    • good
    • 0
この回答へのお礼

ありがとうございます!
うまくいかず長い時間悩んでいたのですが、この方法で解決することができました!

本当に求めていた通りの動きが出来たので大変感謝しています。
あらためてありがとうございました。

お礼日時:2012/05/15 19:46

1行ごとに調べるのでは誤判別が多くなるでしょうね。

file_get_contentsなどでそれなりの量を読み込んでから判断すべきです。

またmb_detect_orderが標準のままだと誤判別の元です(私の環境だと標準の状態で判別出来た例しがないです)。キチンと指定してください。

http://jp.php.net/manual/ja/function.mb-detect-o …

#ましてmb_convert_encodingの[auto]はほぼ無意味です(汗
    • good
    • 0
この回答へのお礼

あちこちのサイトにも記述されてましたが、やはり[auto]は無意味なんですね(笑)
また、たくさんのアドバイスありがとうござました!

お礼日時:2012/05/15 19:47

厳密にいうとないです



よくやられるのは先頭から数キロバイトサンプリングして
特徴的な範囲で文字が現れればその文字コードだと判定することです。
容量の小さいファイルはいずれにしろ難しいですね

ファイルをアップさせるならきちんと仕様を守らせる
というのが最善の対応策です
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
今回はlinuxサーバであったため、上記の方の方法で解決することができました!
ですが、windowsサーバだったら無いのでしょうね・・・。

確かに仕様を決めることが一番の解決策かもしれませんね。
ありがとうございました。

お礼日時:2012/05/15 19:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!