fgetcsvRegによるCSV読み込み時に正常にデータを読み取れない場合がある
同じCSVでも特定の行でのみ発生 最初のいくつかの列のデータしか配列に入ってこない状態
baserCMS version : 4.8.2-dev https://github.com/baserproject/basercms/blob/dev-4/lib/Baser/basics.php#L511 5系にも同様の関数が存在する https://github.com/baserproject/basercms/blob/5.1.x/plugins/baser-core/src/Utility/BcUtil.php#L1608
loadCsvToArrayにて、fgetcsvRegをfgetcsvに変更すると正常にデータを読み取れる https://github.com/baserproject/basercms/blob/dev-4/lib/Baser/Model/Datasource/DboSource.php#L4502
TODO
- 原因となる文字列の特定
- fgetcsvRegをfgetcsvに置き換えできないかの検討
- https://www.php.net/manual/ja/function.fgetcsv.php
fgetcsvの代わりにfgetcsvRegを使用しているのは文字化け対策? https://gyagya1111.blogspot.com/2010/12/php5fgetcsv.html sjisの対応をやめたら不要?
特定のこの文字列が含まれていたら発生するというものではなさそう 「"」の出現回数? fgetcsvReg内の正規表現を使った解析部分でデータが消える
以下のcsvをsjisとutf8で作成 DboSource->loadCsvToArray で読み込み loadCsvToArrayのfgetcsvRegとfgetcsvの違いを確認
"a","i","u"
"あ","い","う"
sjis - fgetcsvReg => OK sjis - fgetcsv => OK utf8 - fgetcsvReg => OK utf8 - fgetcsv => OK
"a","i","u","e"
"あ","い","う","能"
sjis - fgetcsvReg => OK sjis - fgetcsv => NG utf8 - fgetcsvReg => OK utf8 - fgetcsv => OK
"a","i","u","能"
"あ","い","う","能"
sjis - fgetcsvReg => NG sjis - fgetcsv => NG utf8 - fgetcsvReg => OK utf8 - fgetcsv => OK
"a","i","u",""""
"あ","い","う","「"」x6000回の繰り返し"
sjis - fgetcsvReg => NG: 行が複数行に分かれる sjis - fgetcsv => OK utf8 - fgetcsvReg => NG: データが途中で消える utf8 - fgetcsv => NG: 行が複数行に分かれる
"a","i","u",""""
"あ","い","う","「"」x13000回の繰り返し"
sjis - fgetcsvReg => NG: 行が複数行に分かれる sjis - fgetcsv => OK utf8 - fgetcsvReg => NG: データが途中で消える utf8 - fgetcsv => NG: 行が複数行に分かれる
sjis - fgetcsvReg(length制限なし) => NG: データが途中で消える sjis - fgetcsv(length制限なし) => OK utf8 - fgetcsvReg(length制限なし) => NG: データが途中で消える utf8 - fgetcsv(length制限なし) => OK
事前にutf8に変換する方法も考えられるけどsjisの対応をやめるのがよさそう fgetcsvのlength指定もなしにする
テーマの初期データ用CSVでsjisが使われているものがあるので、4系でsjisの対応をやめると問題が起きそう 5系は要調査
fgetcsvRegに文字コード渡してutf8の場合はfgetcsvを返す? sjisの問題は残るけど問題は一番少なさそう
5系はsjisのサポート切りたい
5系だと再現しない PHPのバージョンか、なにかの設定値? 最新版では再現しないので優先度下げる