CSVファイルからデータを取り込むときに文字化け解決方法

CSVファイルをアップロードして、そのデータをデータベースに取り込みたいときありますよね。
その時CSVファイルをそのまま取り込むと文字化けします。文字コードが違うからです。
CSVがShift-JISで、システム側はUTF-8だったりします。
なので、データベースに保存する前に文字コードを変換します。

$fp = fopen('xxxx.csv', 'r');
while ($row = fgetcsv($fp) !== false) {
  mb_convert_variables('UTF-8', 'SJIS-win', $row);
}

これでうまく行ったかなーと思いきや、たまーに文字化けします。なんでや!!

これは5C問題だそうです。
2バイト目が5Cになる文字がいくつかあり、5Cがエスケープ文字として判定されおかしくということです。
解決法は、fgetcsvをする前に変換するとよい。

$sjis = file_get_contents('sjis.csv');
$utf8 = mb_convert_encoding($sjis, 'UTF-8', 'SJIS-win');
file_put_contents('utf8.csv', $utf8);
$fp = fopen('utf8.csv', 'r');

参考:https://qiita.com/suin/items/3edfb9cb15e26bffba11

カテゴリ:PHP 投稿日時:2021年1月2日 17:09


コメント

コメントはまだありません。

コメント投稿

ご自由にコメントください!
※一度投稿すると削除できませんのでご注意ください。管理者の独断と偏見で削除する場合があります。コメント機能は予告なく停止する場合があります。

ニックネーム

コメント

カテゴリ

新着備忘録

「MySQL」ERROR 2013 (HY000) at line : Lost connection to MySQL server during query

MySQLでERROR 2013 (HY000) at line : Lost connection to MySQL server during queryエラーが出た。

CakePHP3 CSSやjavascriptを更新したのに反映されない!

CakePHP3でCSSやjavascriptにタイムスタンプをつける方法です。

CakePHP3のタイムゾーン設定

CakePHP3のタイムゾーン設定方法です。

Thunderbirdで同じメールが何度も届く件

Thunderbirdで同じメールが何度も届く件についてです。

CakePHP3でCSV出力

CakePHP3でCSV出力する方法です。