PHPでコマンド実行しようとしたら日本語が消失した
PHPでコマンドを実行する時はOSコマンドインジェクション対策としてescapeshellcmd
やescapeshellarg
などでエスケープすることが多いと思うが、その際にマルチバイト文字が含まれているとマルチバイト文字が空文字に変換されてしまって困った。
環境
Service | Version |
---|---|
PHP | 7.2.2 |
解決
実行前にロケール情報を設定してあげることで回避できた。
<?php if (! setlocale(LC_CTYPE, "UTF8", "ja_JP.UTF-8")) { throw \Exception('Not exist Locale.'); } $cmd = escapeshellcmd($cmd);
雑感
そもそもマルチバイトがコマンドに入るような設計がどうなの。