Page 1 sur 1
bug escapeshellarg et accents ?
Posté : 16 août 2008, 23:30
par piopier
Bonjour,
J'utilise PHP5.2 sous Linux Ubuntu (PHP 5.2.4-2ubuntu5.3).
Mon problème est que la fonction escapeshellarg supprime tous les caractères accentués ! Ce qui pose problème pour l'application de mon site.
Est-ce un comportement normal ??? Ya-t-il un paramètre de configuration permettant d'éviter cela ?
Il y a quelques mois pourtant, avec une précédente version de PHP, escapeshellarg n'avait pas ce comportement, mes accents étaient conservés...
Posté : 17 août 2008, 00:01
par Hywan
Hey

,
Tout d'abord : bienvenu sur PHPFrance.
Pour connaître le profil de cette fonction, rien ne vaut un tour dans le manuel : escapeshellarg(). Je ne vois rien de mentionné, et une recherche rapide accompagnée d'une lecture en diagonale des commentaires ne m'a rien donné.
Peut-on voir le code (par curiosité) ?
Posté : 17 août 2008, 12:01
par @rthur
Bonjour,
La suppression des accents par escapeshellarg me semble également peu probable...
As-tu vérifié que tu n'ai pas de problème de charset?
Posté : 17 août 2008, 16:16
par Hywan
J'y pense là : il est possible que le terminal ne supporte pas les entrées genre unicode. Mais à quel moment vois-tu que les accents sont supprimés : avant de l'envoyer dans le terminal ou une fois dans le terminal ?
Posté : 19 août 2008, 15:39
par piopier
J'avais bien regardé la doc d'escapeshellarg et ses commentaires sans rien trouver non plus.
Pour un pb de charset, j'en sais rien, mais comment vérifier/modifier ça ?
Le code incriminé fait partie de MediaWiki.
Après avoir trouvé que le pb provenait de l'utilisation de escapeshellarg, j'ai écrit une petite page toute simple pour vérifier :
Code : Tout sélectionner
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
abé 1 <br>
<?php
echo "abé<br>";
echo escapeshellarg("abé");
?>
</body></html>
Ce qui me retourne :
Code : Tout sélectionner
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
abé 1 <br>
abé<br>'ab'
</body></html>
Etrange non ?
Posté : 19 août 2008, 22:45
par Hywan
J'ai testé ça :
Code : Tout sélectionner
$ php -a
Interactive mode enabled
<?php
var_dump(escapeshellarg("abé"));
string(6) "'abé'"
Quelle version de PHP as-tu déjà ? Ensuite, sur quelle plate-forme PHP est-il installé ? Est-ce que les configurations de localisation de PHP sont-elles bien toutes en place ?
Je doute que ce soit un problème de charset. J'ai testé ça dans mon terminal … … mais il est en unicode (utf-8). Je teste autre chose … non bah pareil. Je ne mettrais pas le charset en cause pour ma part (mais je peux me tromper).
Posté : 20 août 2008, 01:08
par piopier
Comme je disais j'ai PHP 5.2.4-2ubuntu5.3, sur Ubuntu donc.
Pour les configurations de localisation de PHP, je ne sais pas de quoi il s'agit, peux-tu m'éclairer ?
Je viens de faire ton test (php interactif), je ne peux alors même pas taper de caractère accentué...
Posté : 21 août 2008, 21:31
par piopier
Et un autre indice : les fonctions comme substr() considèrent les caractères accentués comme s'il s'agissait de deux caractères... !
Posté : 24 août 2008, 23:07
par piopier
Personne n'a une idée ?
Quelqu'un (HyWaN ?) pourrait m'expliquer ce que tu voulais dire par "les configurations de localisation de PHP" ?
Posté : 25 août 2008, 08:36
par Mathieu68
Posté : 26 août 2008, 09:10
par piopier
Ma question portait sur escapeshellarg, donc pour utiliser une chaine comme argument d'une commande pour le shell système, pas (pas tout de suite) pour un affichage sur page web.
Posté : 27 août 2008, 07:51
par mojorisin
Comme je disais j'ai PHP 5.2.4-2ubuntu5.3, sur Ubuntu donc.
Pour les configurations de localisation de PHP, je ne sais pas de quoi il s'agit, peux-tu m'éclairer ?
Je viens de faire ton test (php interactif), je ne peux alors même pas taper de caractère accentué...
Salut,
alors je pense que c'est un problème de locale.
que renvoie la commande locale (dans une console) ?
Posté : 28 août 2008, 09:56
par piopier
Merci pour ta réponse. La commande locale renvoit:
Code : Tout sélectionner
LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
Posté : 28 août 2008, 12:46
par mojorisin
Les locales sont bien en français, je suppose que dans une console tu n'as pas de proplème avec les accents.
Il serait bon de voir alors plusieurs point :
que donne echo escapeshellarg(utf8_encode('abé'));
La directive default_charset de ton php.ini est-elle renseignée ? /etc/php5/apache2/php.ini et /etc/php5/cli/php.ini par défaut sur une Debian)
Dans quel encodage enregistres-tu tes pages ?
Bref beaucoup de petites choses à vérifier.
Posté : 29 août 2008, 23:31
par piopier
-Dans une console habituellement (en dehors du mode interactif de PHP), je n'ai pas de problème d'accent.
- echo escapeshellarg(utf8_encode('abé')); : cela renvoit aussi : 'ab'
- dans php.ini, la directive default_charset était commenté. Je l'ai décommentée et mis à "UTF-8" et redémarré apache : le problème est identique. Mais si je comprends bien cette directive n'est que pour l'envoi des pages html, non ? Or mon problème est en amont : dans mon code, je définis une chaîne avec accent et la donne à escapeshellarg(), pour ensuite l'utiliser avec une commande shell, en l'occurence ImageMagick. Avant même de lancer la commande, les accents sont supprimés, ce qui cause problème.
- mes pages sont toutes enregistrées en utf8.