![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
言語はphpです。
アップロードしたファイルをからデータを1行ずつ抜き取るという作業をしています。
その際にエンコードを下記の方法で行っています。
$lines = mb_convert_encoding(fgets($fp), 'utf-8','shift-jis');
この場合、元のファイルがshift-jisであればなんら問題は無いのですが、すべてのファイルがそうとは限りません。なので、アップロードしたファイルの文字コードを調べ、その文字コードを記述するようにしたいのですが、調べる方法は何か無いでしょうか?
※[auto]を試してみましたが、その際は文字化けが起きていましましたので、出来れば他の方法でお願いします。
自分なりに調べてみましたが、良い情報を見つけることが出来なかったので、ご存知の方は宜しくお願い致します。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?8acaa2e)
No.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
ありがとうございます!
うまくいかず長い時間悩んでいたのですが、この方法で解決することができました!
本当に求めていた通りの動きが出来たので大変感謝しています。
あらためてありがとうございました。
No.2
- 回答日時:
1行ごとに調べるのでは誤判別が多くなるでしょうね。
file_get_contentsなどでそれなりの量を読み込んでから判断すべきです。またmb_detect_orderが標準のままだと誤判別の元です(私の環境だと標準の状態で判別出来た例しがないです)。キチンと指定してください。
http://jp.php.net/manual/ja/function.mb-detect-o …
#ましてmb_convert_encodingの[auto]はほぼ無意味です(汗
あちこちのサイトにも記述されてましたが、やはり[auto]は無意味なんですね(笑)
また、たくさんのアドバイスありがとうござました!
No.1
- 回答日時:
厳密にいうとないです
よくやられるのは先頭から数キロバイトサンプリングして
特徴的な範囲で文字が現れればその文字コードだと判定することです。
容量の小さいファイルはいずれにしろ難しいですね
ファイルをアップさせるならきちんと仕様を守らせる
というのが最善の対応策です
回答ありがとうございます!
今回はlinuxサーバであったため、上記の方の方法で解決することができました!
ですが、windowsサーバだったら無いのでしょうね・・・。
確かに仕様を決めることが一番の解決策かもしれませんね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- Java VScodeのターミナルの文字化けについて 1 2022/09/27 22:19
- HTML・CSS docxをmht形式で保存したファイルをedgeで開くと文字化けする 1 2022/07/29 13:14
- Google Drive 【Googleドライブ】ドライブ上内でのフォルダ移行について 4 2022/11/30 12:50
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- 作詞・作曲 或る曲の楽譜のコード進行の中に"F onA"なるものがありました。これはどんな和音ですか? 7 2023/05/22 00:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハシゴの「高」が「?」に置き...
-
フォーム入力のエンコーディン...
-
phpフォームで文字化け
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
別ファイルの変数を呼び出した...
-
PHPのif文でその処理を途中で抜...
-
CFileDialogの最初のディレクト...
-
.phpと.incファイルの違いはな...
-
「警告:ページの有効期限切れ...
-
「@$変数」の「@の意味は?」
-
リンク先を隠す方法はないでし...
-
2つの画像ファイルが異なるファ...
-
現在位置より2つ上のディレク...
-
Subversionのリポジトリの削除
-
VB6にてメールを送信する方法
-
パースエラーとは?
-
XAMPPでSQL文を流すとフリーズ...
-
データ送信をボタンを押さずに...
-
【file_exists】ファイルが存在...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字集合範囲外の文字とパーセ...
-
(mysql_set_charset)PHPでINSER...
-
EUC-JPのサイトをSHIFT-JISに変...
-
PHPで「®」や特殊文字のエスケープ
-
EUCからshift_jisに書き換えに...
-
携帯の文字化け
-
mysql→EUC-JP、php→UTF-8の時の...
-
PHPで韓国語の表示がうまくいき...
-
PHPでセッション導入後に初めて...
-
ファイルの文字コードを調べる...
-
サーバーにアップすると文字化...
-
サーバーにアップすると文字化...
-
文字コード変えたら、fopenでき...
-
自作cgiのページがIE10で文字化...
-
HTTPヘッダはメタタグにも記述...
-
MySQL+PHPサイトでSJISからEUC...
-
フォーム入力のエンコーディン...
-
海外で作成されたPHPスクリプト...
-
wordpressがMySQLに日本語デー...
-
フォームからPOSTされた値をXML...
おすすめ情報