escapeshellarg関数は日本語対応していない

 syncthingサーバ上のファイルをローカルにコピーするスクリプトで、呼び出しているcpコマンドが「ファイルがありまへんで」とエラーを吐いていた。ディバグしてみると、escapeshellarg関数が日本語(というか2バイト文字?)にそのままでは対応していなかったことだった。

 対応策はスクリプト内でsetlocaleすること。
mochi227.blog.jp

<?php
echo escapeshellarg("あいうえお.txt"). PHP_EOL;
echo setlocale(LC_ALL, 0) . PHP_EOL;
?>
kazz@oscar ~# php bin/test/test59.php
'.txt'
C
kazz@oscar ~# cat bin/test/test59.php
<?php
setlocale(LC_CTYPE, 'ja_JP.UTF-8');
echo escapeshellarg("あいうえお.txt"). PHP_EOL;
echo setlocale(LC_ALL, 0) . PHP_EOL;
?>
kazz@oscar ~# php bin/test/test59.php
'あいうえお.txt'
LC_CTYPE=ja_JP.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
kazz@oscar ~# 

 とりあえずうまくいった。
 こんなもんいちいちやらなくてすむ方法はないかと探したが、見つかった解決策はどれもapacheサーバで動かしている事例ばかりで、cliのものは見つからなかった。シェルのlocale設定はできていると思うんだが。