アプリ版:「スタンプのみでお礼する」機能のリリースについて

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; ?>

A 回答 (2件)

文字コードについては以下の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">などです。

文字コードは色んな環境が絡んでくるのでなかなか難しいのですが日本人プログラマの宿命です。
慣れましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。

大本のhtmlファイルは次のように文字コードを設定してます。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

なんだか、いろいろあるのですね。大変ですが、頑張ります。

今、部屋にある書籍を読み直しているところでして、PHPのいろいろな機能を、どのような場面で使えばいいのか考えているところでした。

今後とも宜しくお願い致します。

お礼日時:2013/02/19 01:58

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 …
    • good
    • 0
この回答へのお礼

ありがとうございます!

参考にさせて頂きます!!

お礼日時:2013/02/20 15:48

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