PHP5.6.30のmb_convert_variables関数でCannot handle recursive references

コピペチェック

CopyContentDetectorのCSVアップロード機能で不具合をおこしてしまいました。具体的には、「CSVをアップロードすると文字化けする」という内容です。

 

■仕様

Excelで開けるCSVである「改行コードはCR+LF、文字コードはSJISのファイル」形式のCSVをアップロード出来るようになっています。このCSVがアップロードすると文字化けする。という不具合です。CSVファイルはSJIS系の文字コード、プログラム内部やDBではUTF-8の文字コードを利用しています。

Excelのバージョンやエディタによって、文字コードが若干違うので復数指定してあげる必要があるのです。以下の様なコードで殆どのExcelが扱うCSVのファイルに対応することが出来ます。

mb_convert_variables('UTF-8', 'MS932,SJIS-win,SJIS', $line);

 

■原因

PHPのマイナーバージョンアップをしたことによって、文字コードの変換ができなくなっていました。文字コード変換にはmb_convert_variables関数を利用しているのですが、mb_convert_variablesの第2引数の文字コード指定がPHP 5.6.30/PHP 7.0.16/PHP 7.1.1あたりで復数指定できなくなる不具合があるようです。文字コードを一つだけなら指定ができるみたいですね。

セキュリティ対応でいろいろサーバのミドルウェア更新したら、このあたりのバージョンのPHPに更新されて不具合になってしまいました。

マイナーバージョンアップでこの不具合が出るとは、、、油断してしまいました。

 

より詳細な情報は以下です。

PHP :: Bug #73322 :: mb_convert_variables detects recursive reference incorrectly

 

■回避方法

MS932だけで対応しようとしたのですが、文字化けが発生することも稀にあるようです。もうこのmb_convert_variablesは利用しないで対応することにしました。mb_convert_encodingで一つずつ変換することになりました。

 

ご連絡いただきましたユーザの皆様、本当にありがとうございました。すぐに対応することが出来ました。

今後共CopyContentDetectorをよろしくお願いいたします。