La fonction PHP escapeshellarg
dépend de votre locale courante. Je pense que c’est mal, mais les développeurs de PHP on fait ce choix. Si comme moi votre locale par défaut est ‘C’, vous perdez vos caractères UTF8.
Ils suggèrent d’utiliser quelque chose comme setlocale(LC_CTYPE, "en_US.UTF-8")
. Ça ne fonctionne pas si la locale en_US.utf8
n’est pas installée sur votre système. Bien sûr vous avez peut-être fr_FR.utf8, ou de_DE.utf8, mais vous aller devoir toutes les essayer jusqu’à trouver une locale utf8 qui correspond. Et s’il n’y en a pas vous êtes foutus. C’est mauvais aussi si vous voulez du code qui marche partout.
Utilisez simplement :
$escapedArg = "'".str_replace("'", "'\\''", $arg)."'";
Ça fait la même chose que la fonction escapeshellarg
: remplacer chainel'hyperlongue
par
'chainel'\''hyperlongue'
comme décrit dans le manuel de escapeshellarg (et j’ai aussi jeté un œil au code source de PHP pour être sûr).
Voir aussi :