@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

PHPのescapeshellargが日本語を消し去った

LC_CTYPEの値によって、escapeshellargでのマルチバイトの扱いが変わる。

execに日本語を渡すと空の文字が渡ってしまった。

ローカルとサーバーで挙動が違うから焦った。

事前にsetlocaleで設定する方法で解決した。

if(false == setlocale(LC_CTYPE, "UTF8", "ja_JP.UTF-8")){
  die("skip setlocale() failed\n");
}

grokbase.com

別のサイトではescapeshellargが呼び出す関数のCの実装から、PHPで実装してしまう方法も載っていた。

PHP escapeshellarg with unicode/utf-8 support - markushedlund.com

ここは/etc/sysconfig/i18nに書くと良いと書いているが、それは設定済みだったので、反映されていなかった模様。

phpのescapeshellarg()に日本語を渡す際の注意 | Firegoby

ここは何が起こっているのかを調べた話

d.hatena.ne.jp