PHPで escapeshellcmd でエスケープしていると、日本語が消えて困ったのでメモ

公開日: 


escapeshellcmd()を使用するシーン

PHPでファイルダウンロードなど実装する際に、
セキュリティ対策のOSコマンドインジェクションをさせないように、
escapeshellcmd() を使うことが多いと思います。

不幸は突然に

ある日突然マルチバイト文字(日本語)が消えてしまい、
なんだろうと思い、デバッグしていくと、この escapeshellcmd() に引っ掛かりました。
(そもそもマルチバイト文字は推奨しない感じがしますが、ここでは割愛)


原因

OS替えなどで、ロケール情報が取れなくなったようです。

対策

escapeshellcmd() 実行前に以下設定すると直りました。

setlocale(LC_CTYPE, "UTF-8", "ja_JP.UTF-8");