ここから質問投稿すると、最大10000ポイント当たる!!!! >>

どうもこんにちわ。PHP初心者です。

どうか助けてください!

CSVファイルを読み込んで表示させるプログラムなんですが、
サーバーが変わったら、日本語のデータのみ表示されなくなりました。

以前質問があった下記件と同じ事象で、
参考に色々試してみましたが上手くいきません。
http://oshiete1.watch.impress.co.jp/qa5972094.html

ソースは下記です。
どうか、どこをどういじれば良いか、どなたか教えて頂けないでしょうか?
何卒よろしくお願いします。
------------------
<?php
//今日の日付を取得
$today = date("Ymd");
//表示数の設定。
$disp_num = 1;
//CSV格納先
$fp = fopen("data/today_word.csv", "r");

while ($data = fgetcsv($fp, 10000)) {
for($n = 0; $n < count($data); $n++){
$data[$n] = mb_convert_kana($data[$n], "ak", "SJIS");
}

if ((ereg($today,$data[0]))) {
$result[] = "<a href='$data[2]'>$data[1]</a><br />";
}
}
fclose ($fp);

?>
-----------------------------

このQ&Aに関連する最新のQ&A

PHP 日本語」に関するQ&A: PHP日本語対策

A 回答 (2件)

申し訳ありません。


こちらで テスト用のCSVファイルを作り、確かめました。

完全に 挙動を思い違いしておりまして、#1のでは、エラーが出たというより、
無限ループ発生で、タイムアウトで落ちたんではないかと思います。

前回と同じ部分を 以下のように変更するとどうでしょうか?

while ($str = fgets($fp, 10000)) {
$data = explode(',', trim($str));
    • good
    • 0
この回答へのお礼

上手くいきました!
相談に出して本当に良かったです。

ありがとうございました!!

お礼日時:2010/12/01 01:30

とりあえず、なんも確認とかしておりませんので、うまく動かなかったらご報告ください。



そちらが提示されたリンクと同じ事をすれば良いのではないかと思います。

そちらのソースの↓以下の部分を、
while ($data = fgetcsv($fp, 10000)) {

以下のように書き換えてみるとどうなるでしょう?
while ($data = explode(',', trim(fgets($fp, 10000)))) {

日本語の入ったCSVファイルをfgetcsv()する場合は、文字コードに気をつけないと地雷になるっぽいです。
    • good
    • 0
この回答へのお礼

ありがとうございます!!

でも、
上手くいかないです。

エラーになってしまいました。。

どうすれば良いでしょうか。

お礼日時:2010/12/01 00:06

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCSVファイルの読み込みで日本語が出力されない!

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

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>...続きを読む

Aベストアンサー

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

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

文字コードについては以下の3つを気をつけてください。

・スクリプトを記述している文字コード
・外からやってくるテキストデータ(インプットされるデータ)の文字コード
・画面に表示するテキストデータ(アウトプットされるデータ)の文字コード

鉄板の処理は、
(1)インプットデータ取得時にまとめてスクリプト(を記述している)の文字コードにコンバート。
(2)アウトプット直前にアウトプットの文字コードにまとめてコンバート。
です。

例えば質問のコードがutf8で記述されているとすると、
while($data = fget...続きを読む

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

Qファイルの文字コードを調べるには?(php)

言語はphpです。

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

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

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


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

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

Aベストアンサー

ファイルの文字コード統一については、運用周りやユーザ教育で徹底するのが今後のためになります。しかし、どうしてもプログラム側で対処しなければならないのであれば。
たいていの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

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

参考URLに書いてある通りなのですが、かいつまんで解説すると。
function file_charset ($charset_...続きを読む

QNotice: Undefined offset: 1を表示させたくない

$fieldにあるの文字列のうちURLのFQDN部分を全て省くプログラムを、
教えてグーで以下のようにおそわったのですが・・・

$pattern="/https?:\/\/[\w:%#\$&\?\(\)~\.=\+\-]+/";


$field = preg_replace_callback($pattern,function ($matches){
return parse_url($matches[1],PHP_URL_PATH);
},$field);

echo $field;

なんかの条件で、
Notice: Undefined offset: 1 in /home/xxxxx/www/xxxxx/wp-content/themes/xxxxx/category.php on line 33

のnoticeが出ます

このnoticeが出ないようにするにはどこを変えればいいのでしょうか?
よろしくお願い申し上げます。(phpのエラー設定を変える以外で)

Aベストアンサー

マッチしていないので$matches[1]が未設定だというエラーですね

>return parse_url($matches[1],PHP_URL_PATH);

を、たとえば

return isset($matches[1])?parse_url($matches[1],PHP_URL_PATH):"";

にするなどで対応してみては?


人気Q&Aランキング