特定ファイルにある複数行の日本語文章を
「fgets」や「file_get_contents」などで画面に読み込む時は、
単純に「mb_convert_encoding」を使えば
良いと思ったのですが
下記のようには文法的にも使えませんでした。
--------------------------------------
<?php
$fp = fopen("sample.txt", "r");
$fp = mb_convert_encoding($fp, "UTF-8"); ←※間違い
if($fp){
flock($fp, LOCK_SH);
while(!feof($fp)){
$data = fgets($fp);
echo "$data<br>";
}
flock($fp, LOCK_UN);
}
fclose($fp);
?>
--------------------------------------
すでに書き込んである
日本語が複数行書かれたファイルから
文字化けしないようにデータを読み込んで表示するには
どのような処理をしたら良いのでしょうか?
複雑な処理はまだ理解できないので
簡単な処理方法があれば
お教えください。
よろしくお願いいたいます。
No.4ベストアンサー
- 回答日時:
>> $fp = file_get_contents("sample.txt");
ちょっとこれは変数名がよくないですね。ただの文字列に対して「$fp」(FilePointer)は不適切でしょう。PHPの値の型と、fopen・fgets・file_get_contentsのマニュアルを再確認してください。
PHP Manual - 型
http://www.php.net/manual/ja/language.types.php
PHP Manual - fopen
http://www.php.net/manual/ja/function.fopen.php
PHP Manual - fgets
http://www.php.net/manual/ja/function.fgets.php
PHP Manual - file_get_contents
http://www.php.net/manual/ja/function.file-get-c …
個人的に「fgets」はほとんど出番がないと思っています。「1行ずつ」読み込んだところでPHPの場合は末端に改行コードが付いてきますし、ちょっと使いにくいと思います。ファイルを処理する関数はいろいろあるので下記を参考にどうぞ。
Qiita - [PHP] ファイルオープンモードに関するマニュアルの記述は間違っている #さまざまなファイル読み出し関数
http://qiita.com/mpyw/items/3adcec3c66e515895b08 …
preタグを使わない場合に導入するnl2br関数に関しては、HTMLとする場合は第2引数にfalseを指定すべきです。デフォルトだとXHTML仕様の「<br />」になってしまうので、HTML仕様の「<br>」と違うことに注意してください。
PHP Manual - nl2br
http://www.php.net/manual/ja/function.nl2br.php
応用的な方法として、fopen関数で開いたリソースに自動的に文字コードを変換するフィルタをつけることが出来ます。これに関してはマニュアルにも詳しくは載っていません。以下のブログエントリを参考にどうぞ。但し、こちらの方法の場合は文字コードの自動判定は使えないようです。あらかじめ変換元の文字コードを知っていなければなりません。
ぱせらんメモ - ストリームフィルタで文字コード変換してみる
http://d.hatena.ne.jp/pasela/20081224/stream_fil …
CP932(Windowsが名乗っている「Shift_JIS」は実際には「CP932」です)からUTF-8に変換する方法で、あなたが試みようとしたコードに一番近い形で書くならば以下のようになります。「rb」ではなく「r」単体で開くとWindowsであれば改行コードが全て「\r\n」、Linuxであれば「\n」に勝手に変換されるので、ここではOSがWindowsであると仮定します。
if ($fp = fopen('sample.txt', 'r')) {
stream_filter_prepend($fp, 'convert.iconv.cp932/utf-8', STREAM_FILTER_READ);
flock($fp, LOCK_SH);
while (false !== $data = fgets($fp)) {
echo rtrim($data) . "<br>\n";
}
flock($fp, LOCK_UN);
fclose($fp);
}
ループ条件にfeof関数を含めるのは、ローカルファイルを開く場合は大して問題ないですがネットワークストリームの場合には不適切で汎用的な方法とは言えないので、fgets関数の返り値を調べる方が無難です。PHPのマニュアルもそういう書き方になっていますよね。また、
ehco "$data<br>"
とすると、実際にファイルを表示したときにソース上で
1行目[\r\n]
<br>2行目[\r\n]
<br>3行目[\r\n]
<br>4行目
となってしまって非常に不恰好なので、
1行目<br>[\n]
2行目<br>[\n]
3行目<br>[\n]
4行目
となるようにしました。というかこんなことするぐらいなら「1行ずつ」読む意味って全く無いですよね…file_get_contentsを使わないにしても、fopen+stream_get_contentsでいいような気が…
詳しい説明本当に感謝しております。
すぐには理解できるとは思っていませんが
少しずつよんで勉強してみます。
本当にありがとうございました!
No.3
- 回答日時:
>教えていただいた方法で「fopen」では
>できないのでしょうか?
fopenが返すのはあくまでもファイルハンドルリソースです。実際にファイルから読込むのは
$data = fgets($fp);
この部分です。なのでechoしている部分を
echo mb_convert_encoding($data, 'utf-8', 'ASCII,JIS,UTF-8,CP51932,SJIS-win') . '<br>';
としてやればいいです。
なお、
><pre>を使わないと改行はされないのですが
nl2br(mb_convert_encoding(file_get_contents('sample.txt'), 'UTF-8', 'ASCII,JIS,UTF-8,CP51932,SJIS-win'))
として、改行コードを<br>に変換してやればいいです。
マニュアルが英語で意味があまり分からず
あまり見ていなかったのですが
やっと最近少しずつ分かり始めてきました。
ここでいうfopen関数も返り値の型が重要になるのですね。
ありがとうございました!
No.2
- 回答日時:
>文字化けしないようにデータを読み込んで表示するには
ポイントは3つ
(1)すでにあるファイルであれば最初からキャラクターセットは
わかっているはずなので、それをズバリ指定してやればいい
(2)もしなんらかの理由でキャラクターセットのわからないデータを
読まなくてはいけない場合、サンプル数がすくなければどの
キャラクターセットなのか判断することは難しい
よくエディタでテキストファイルを自動判別開くと文字化けしているようなもの。
そういう場合は、テキストファイル内に特定のキーワードを埋め込むようにして
それを見て判断するのが妥当。
(たとえば昔よく利用された美乳やら京やらの文字を入れ込んでおくテクニック
UTF8には通用しませんが・・・)
私の利用しているエディタだと「@@」という文字を埋め込んでおくと
自動判定がより正確になります
(3)そもそも読み込み時にはきちんと読まれていて、出力時に文字化けしているだけかも。
その場合は、元の文字の文字コード、出力する文字コード、httpヘッダの文字コード
htmlであればmetaで指定する文字コードをあわせるとよいでしょう
これまで文字化けするということはなかったので
文字コードのことは全く気にしていなかったのですが
文字コードの大切さをここで知ることになりました。
まだまだ先は程遠いことを実感しております。
ありがとうございました。
No.1
- 回答日時:
<pre><?=mb_convert_encoding(file_get_contents('sample.txt'), 'UTF-8', 'ASCII,JIS,UTF-8,CP51932,SJIS-win')?></pre>
とかでどうですか?mb_convert_encodingの第3引数は省略せずにこのように指定したほうが確実です。これが日本語ファイルを扱う上で最も正確に判定できる順番です。
この回答への補足
早速のご回答ありがとうございます。
教えていただいた方法で「file_get_contents」を使うと
上手く文字化けが回避できました。
$fp = file_get_contents("sample.txt");
$fpm = mb_convert_encoding($fp, "UTF-8", "ASCII,JIS,UTF-8,CP51932,SJIS-win");
echo $fpm;
<pre>を使わないと改行はされないのですが
課題として後で勉強してみます。
教えていただいた方法で「fopen」では
できないのでしょうか?
フォームで書き込んだ文字を読み込むのは
「mb_convert_encoding」などを
使わなくても文字化けはしないのですが
読み込んでくるファイルに直接書き込んだりすると
文字化けになってしまうということを
今回はじめて知りました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- フィナンシャルプランナー(FP) FP検定は「エフピーけんてい」で読み方会ってますか汗 2 2022/04/20 22:37
- フィナンシャルプランナー(FP) FP相談に、本人確認は必須ですか? 3 2022/04/25 11:03
- 営業・販売・サービス FP無料相談サービスの営業電話がきて、お金は一切かからないと言われたので指定されたカフェを訪問したら 2 2022/12/22 21:52
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
このQ&Aを見た人はこんなQ&Aも見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
fgetsで2行目から文字化け
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
shift-jisでfgetcsv
-
2つの画像ファイルが異なるファ...
-
stdinからの処理でメール情報を...
-
ファイル名は、数字の「0」(...
-
3つ以上の論理積は利用可能なの...
-
PHPのif文でその処理を途中で抜...
-
Subversionのリポジトリの削除
-
エンコーディングについて
-
FTPコマンドでディレクトリごと...
-
「クラス関数」「メンバ関数」...
-
onedrive にexcelファイルをア...
-
CFileDialogの最初のディレクト...
-
VBSの「MsgBox」について
-
フォントの色を変えるには?
-
PHP8を使うと、大量のWarningが...
-
php文字列中のシングルクオート...
-
バッチを用いたフォルダの自動移動
-
シェルスクリプトからphpファイ...
-
さくらレンタルサーバーでPHPが...
-
さくらサーバーにて、phpからメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPでFilename cannot be empty...
-
2つの画像ファイルが異なるファ...
-
pdfファイルをメンバーのみに閲...
-
stat failed
-
phpのftp_get()でエラーが出ます。
-
ファイル名は、数字の「0」(...
-
ファイルの行数取得
-
PHPでAPI 出力はCSVを取得する...
-
XMLのロードに失敗する
-
アクセス毎にリンクを自動変更
-
AS3外部テキスト読み込み
-
別のサーバにあるファイルの存...
-
Smartyで吐き出されたhtmlソー...
-
TSVファイルをCSV形式に変換したい
-
PHP5のsimplexml_load_fileで取...
-
php アップロードファイルが*....
-
PHPで特定の文字列のみ抽出し、...
-
ファイルを開いたままオープン...
-
ファイルを白紙にする
-
日本語が文字化けしないよう読...
おすすめ情報