PHPを使ってCSVファイルを部分的に読み込むコードを教えてもらいました。
しかし、CSVに入力している英語と数字は出力されるのに、日本語は空白のままでした。
教えてもらったコードは次の通りですですが、日本語も出力する場合、どうしたら良いのでしょうか?
<?php
function h( $str ) {
return htmlentities( $str, ENT_QUOTES, 'UTF-8' );
}
?>
<? if (($handle = fopen("test.csv", "r")) !== FALSE) : ?>
<table class="table1" width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<? $i = 0; ?>
<? while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) : $i ++ ?>
<td><?=h($data[0])?><img src="http://1-<?=h($i)?>.gif"><br><?=h($data[1])?><br><?=h($data[2])?><br><span class="red"><?=h($data[3])?>円</span></td>
<? endwhile; ?>
</tr>
</table>
<? fclose($handle); ?>
<? endif; ?>
No.1ベストアンサー
- 回答日時:
文字コードについては以下の3つを気をつけてください。
・スクリプトを記述している文字コード
・外からやってくるテキストデータ(インプットされるデータ)の文字コード
・画面に表示するテキストデータ(アウトプットされるデータ)の文字コード
鉄板の処理は、
(1)インプットデータ取得時にまとめてスクリプト(を記述している)の文字コードにコンバート。
(2)アウトプット直前にアウトプットの文字コードにまとめてコンバート。
です。
例えば質問のコードがutf8で記述されているとすると、
while($data = fgetcsv($handle, 1000, ","))の後で、$dataの文字コードチェックし、
utf8じゃなければutf8にコンバートしてください。
getcsvの戻り値は配列なのでforeachで回してください。
foreach($data as $k => $v) $data[$k] = mb_convert_encoding($v, "utf8");
前回の回答と同じく上記コードは試してないので動かないかもしれません。
foreachを使わずにarray_mapとcreate_funcを使う方法もあるけど、ちょっと難しいかも。
また、上記は元の文字コードチェックはしていません。
それでうまくいかない場合はphp.iniのmb絡みの設定を見直したり、
mb_detect_encodingとかを組み合わせてみてください。
今回はスクリプトにHTMLが記述されている、つまりアウトプットの文字コードとスクリプトの文字コードが同じです。
なので、スクリプトの文字コードであるutf8に変換したらそのままアウトプットしても問題ありません。
ただ、htmlの文字コードを正しく指定してあげてください、<meta charset="utf-8">などです。
文字コードは色んな環境が絡んでくるのでなかなか難しいのですが日本人プログラマの宿命です。
慣れましょう。
ありがとうございます。
大本のhtmlファイルは次のように文字コードを設定してます。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
なんだか、いろいろあるのですね。大変ですが、頑張ります。
今、部屋にある書籍を読み直しているところでして、PHPのいろいろな機能を、どのような場面で使えばいいのか考えているところでした。
今後とも宜しくお願い致します。
No.2
- 回答日時:
fgetcsvのマニュアルに一応書いてはあるのですが……
http://php.net/manual/ja/function.fgetcsv.php
> この関数はロケール設定を考慮します。
とあるように,setlocale関数を使ってLC_CTYPEを設定し,CSVの文字コードと同じ文字コードを含むロケールを指定しておく必要があります。
http://www.php.net/manual/ja/function.setlocale. …
ところが,このロケールの設定値はシステムに依存します。
また,設定値のリストをプログラムで取得する標準的な方法が無いため,
システムに依存した方法で調べる必要があります (コマンド入力したり,マニュアル調べたりetc.)。
# おそらく,そのままPHPのCコード中でsetlocaleに渡されるのだと思います (標準Cのsetlocaleの設定値はシステム依存)
str_getcsv関数が使えるのであれば,文字コードの変換はmb系関数を使ってしまうことで,汎用に作れるかと思います。
http://www.php.net/manual/ja/function.str-getcsv …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
$str=preg_replace('/\\u3000/'...
-
XML出力時の日本語一部文字化け
-
mysql utf8、php・euc-jp で出...
-
文字化け
-
ハシゴの「高」が「?」に置き...
-
onedrive にexcelファイルをア...
-
VBSの「MsgBox」について
-
こちらはただの直列処理ですか?
-
複数ファイルを連続でダウンロード
-
パースエラーとは?
-
リンク先を隠す方法はないでし...
-
拡張子php画像をjpg画像等に変...
-
図に示す階層構造で,現在のデ...
-
C# Excelファイルへの画像挿入。
-
PHPとCSVで簡易データベースな...
-
Subversionで、ファイルをリネ...
-
ワードプレス、Contact Form 7...
-
include先でのinclude元の変数...
-
PHPのif文でその処理を途中で抜...
-
PHPでネットワークドライブのop...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エンコーディングについて
-
phpのhex2binについてphpで、ut...
-
ハシゴの「高」が「?」に置き...
-
PHPでCSV出力時の文字化け(一部)
-
$str=preg_replace('/\\u3000/'...
-
PHPの文字化けした文字だけ削除...
-
phpMyAdminで文字化け
-
【PHP】ファイル読み込みで...
-
MySQL文字コード
-
windowsXP、XAMPPでメーラーMer...
-
i18n_convert と mb_convert_e...
-
データベースから取り出した日...
-
scandir関数取得結果の文字化け
-
PHPフォーム→PHP確認画面で...
-
文字化け
-
XML出力時の日本語一部文字化け
-
header("location~")をPOSTで...
-
PHPの文字コード (php.iniの...
-
PHPExcelで日本語(漢字)ファ...
-
mysql utf8、php・euc-jp で出...
おすすめ情報