PHP(ピー・エイチ・ピー)

ファイルの読み込みで文字化けが発生します!!

 今日は文字化けでハマりました。

 

大量の住所データをテキストファイルから読み込んでデータベースにインサートする処理だったのですが、

訳あってそのテキストファイルはShift_JISで保存されていました。

 

データベースはUTF-8です。

 

テキストファイルの1レコードのデータのサンプルは以下になります。
「13, 北海道, ホッカイドウ」

 

そこで、以下の様にプログラムを書きました。

setlocale(LC_ALL, "ja_JP");

if(file_exists("sample.txt")){

$fp = fopen(FILENAME, "r"); //データファイルを読み込みモードでオープン
flock($fp,LOCK_EX); //データファイルのロック

//ファイルの読み込み
while($data = fgetcsv($fp, 8960, ",")){
$pref_cd = $data[0];
$pref_name = mb_convert_encoding($data[1], "UTF-8", "sjis-win");
$pref_kana = mb_convert_encoding($data[2], "UTF-8", "sjis-win");

~~ データベースへのインサート処理 ~~

}

flock($fp,LOCK_UN); //ファイルのロック開放
fclose($fp); //ファイルのクローズ

}

これだと、

例えば「$pref_name」の中をechoで出力してみた時に、

「k海道」といった感じで1文字目の「北」が「k」に化けてしまいました。

 

原因は、

fgetcsv()でデータを読み込む際に文字化けが発生していたみたいです。

 

で、更に調べてみると、

setlocaleでエンコードも同時に指定する必要があるとのこと。

 

そこで以下の様ま感じでエンコードも指定してやりました。
setlocale(LC_ALL, "ja_JP.UTF-8");
setlocale(LC_ALL, "ja_JP.EUC-JP");
setlocale(LC_ALL, "ja_JP.Shift_JIS");

 

が、状況は変わらず。

 

もう、面倒なので今回はfgetcsv()を使うの止めて、

以下の様に書き直しました。

setlocale(LC_ALL, "ja_JP");

if(file_exists("sample.txt")){

$fp = fopen(FILENAME, "r"); //データファイルを読み込みモードでオープン
flock($fp,LOCK_EX); //データファイルのロック

//ファイルの読み込み
while($line = fgets($fp)){
$data = explode(",", $line);
$pref_cd = $data[0];
$pref_name = mb_convert_encoding($data[1], "UTF-8", "sjis-win");
$pref_kana = mb_convert_encoding($data[2], "UTF-8", "sjis-win");

~~ データベースへのインサート処理 ~~

}

flock($fp,LOCK_UN); //ファイルのロック開放
fclose($fp); //ファイルのクローズ

}

これで文字化けの問題は解決です。

 

今回のような問題は日本語を「"(ダブルコーテーション)」で囲っていない時に発生する現象のようです。

この記事を書いている人
株式会社ディープ
名前足立拓也

メールアドレスadachi@deep-deep.jp

関連記事

最近の記事

  1. ドメインについて
  2. WP:WordPress(ワードプレス)
  3. URL設計(URLデザイン)
  4. URL「ディレクトリ名」と文字アンダースコア(_)とハイフン(-)
  5. SEO対策(外部ファイルの読み込み)
  6. URL リダイレクト
  7. インデックスされない
  8. 内部対策は必要?
  9. CMS(シーエムエス)
  10. SEO業者は必要?

アーカイブ

PAGE TOP