LC_CTYPEの値によって、escapeshellarg
でのマルチバイトの扱いが変わる。
execに日本語を渡すと空の文字が渡ってしまった。
ローカルとサーバーで挙動が違うから焦った。
事前にsetlocaleで設定する方法で解決した。
if(false == setlocale(LC_CTYPE, "UTF8", "ja_JP.UTF-8")){ die("skip setlocale() failed\n"); }
別のサイトではescapeshellargが呼び出す関数のCの実装から、PHPで実装してしまう方法も載っていた。
PHP escapeshellarg with unicode/utf-8 support - markushedlund.com
ここは/etc/sysconfig/i18n
に書くと良いと書いているが、それは設定済みだったので、反映されていなかった模様。
phpのescapeshellarg()に日本語を渡す際の注意 | Firegoby
ここは何が起こっているのかを調べた話