PHP4.xxでSQLIte3で行っています。

名簿をCSVデータで一気にDBにインサートしたいのですが・・・
なぜか名前の1~2文字目あたりのみ文字化けします。

色々試行錯誤していますが・・・
糸口が見つからなくて・・・

どなかたかご教授して頂けませんか?!
文字化け具合(というよりアルファベットに変わってる)が画像を参照してください。

CSVデータでは、山崎まさよし、abc、岡田てるお
となっています。

ちなみにコードはこのような形です。

--------------------------------------------------------
$updir = "./csv/";
$save_name = "list.csv";

if (is_uploaded_file($_FILES["csv"]["tmp_name"])) {

if (move_uploaded_file($_FILES["csv"]["tmp_name"], $updir.$save_name)) {
chmod($updir.$save_name, 0644);
echo "<br />CSVファイルをアップロードしました。";


// CSVの各内容をインサート
$row = 1;
$handle = fopen($updir.$save_name, "r");

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$insert = "insert into list values (";
$insert_row = "";
$row++;

for ($c=0; $c < $num; $c++) {
$data[$c] = mb_convert_encoding($data[$c], "EUC-JP", "SJIS");
$insert_row .= "'".$data[$c]. "',\n";

}

$insert_query = $insert.$insert_row;

$insert_query = substr($insert_query, 0, (strlen($insert_query)-2) );
$insert_query .= ")";

if(sqlite_query($insert_query, $conn)){

} else {
echo "<br>配信先情報の追加を失敗しました。";
}

}
}
}

fclose($handle);
--------------------------------------------------------

「CSVデータ読込だら・・・1文字目のみ文」の質問画像

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

A 回答 (1件)

EUC-JPで保存しようとしていますね。


SQLiteはUTF-8で保存した方がいいので、

$data[$c] = mb_convert_encoding($data[$c], "UTF-8", "SJIS");

とします。

読み込みはEUC-JPで行っているようですから、出力時に
$data = mb_convert_encoding($data, "EUC-JP", "UTF-8");
でEUCに戻すか、プロジェクト全体の文字コードをUTF-8にしましょう。

まだ、書き始めだと思うので、プロジェクト全体をUTF-8に
することをお勧めします。
    • good
    • 0
この回答へのお礼

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

とても参考になりました。

お礼日時:2009/06/07 22:13

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

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

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

Qダブルクォーテーション囲いカンマ区切り形式で保存したい

お願いします。
エクセル2000使用してます。
【質問1】
"名前A","ナマエA","09011111111","aaa@docomo.ne.jp"
"名前B","ナマエB","09011111112","bbb@docomo.ne.jp"
"名前C","ナマエC","09011111113","ccc@docomo.ne.jp"
このように、ワークシートをダブルクォーテーション囲いカンマ区切り形式で保存するにはどうすればよいでしょうか。

【質問2】
上記のデータを読み込むときに電話番号部分の先頭の0が取れてしまうの防ぐために、ファイルの拡張子をtxtにリネームしておいて、エクセルから開くときにウィザードで列のデータ形式を文字列と指定しています。もっと簡単な方法が教えてください。(頻繁にファイルを開くので。。。)

Aベストアンサー

1.マクロを使わないと出来ません。
  こんな感じです。
 Open "CsvFileName.csv" for Output as #1
 For Row = 1 to 10
  For Col = 1 to 10
   Select Case Col
    Case 1
     Print #1 Chr$(&H22) & Cell(Row, Col).Text & Chr$(&H22);
    Case 2
     Print #1 Chr$(&H22) & Cell(Row, Col).Text & Chr$(&H22);
    Case Else
     Print #1 Cell(Row, Col).Text;
   End Select
   If Col = 10 Then
    Print #1, ""
   Else
    Print #1, ",";
   End If
  Next Col
 Next Row
 Close #1

2.マクロを使えば自動化できます。
「データ」メニューの「外部データの取り込み」で「テキストファイル」を指定してCSVファイルを選択します。
テキスト取り込みウィザードで列のデータ形式を文字列と指定します。
上記の操作を「マクロの記録」でマクロにしてから
実用になるようにマクロを修正します。

1.マクロを使わないと出来ません。
  こんな感じです。
 Open "CsvFileName.csv" for Output as #1
 For Row = 1 to 10
  For Col = 1 to 10
   Select Case Col
    Case 1
     Print #1 Chr$(&H22) & Cell(Row, Col).Text & Chr$(&H22);
    Case 2
     Print #1 Chr$(&H22) & Cell(Row, Col).Text & Chr$(&H22);
    Case Else
     Print #1 Cell(Row, Col).Text;
   End Select
   If Col = 10 Then
    Print #1, ""
   Else
   ...続きを読む


人気Q&Aランキング

おすすめ情報