Je tente de supprimer les accents des caractères dans une chaîne PHP comme première étape pour rendre la chaîne utilisable dans une URL.
Je utilise le code suivant:
$input = "Fóø Bår";
setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);
print($output);
Le résultat auquel je m'attends serait quelque chose comme ceci:
F'oo Bar
Cependant, au lieu des caractères accentués translittérés, ils sont remplacés par des points d'interrogation :
F?? B?r
Tout ce que je trouve en ligne indique que définir la locale résoudra ce problème, cependant je le fais déjà. J'ai déjà vérifié les détails suivants:
- La locale que je définis est prise en charge par le serveur (incluse dans la liste produite par
locale -a
) - Les encodages source et cible (UTF-8 et ASCII) sont pris en charge par la version de iconv du serveur (inclus dans la liste produite par
iconv -l
) - La chaîne d'entrée est encodée en UTF-8 (vérifiée en utilisant la fonction
mb_check_encoding
de PHP, comme suggéré dans la réponse de mercator) - L'appel à
setlocale
est réussi (il renvoie'en_US.utf8'
plutôt queFALSE
)
La cause du problème:
Le serveur utilise la mauvaise implémentation de iconv. Il a la version glibc au lieu de la version libiconv requise.
Notez que la fonction iconv sur certains systèmes peut ne pas fonctionner comme vous vous y attendez. Dans ce cas, ce serait une bonne idée d'installer la bibliothèque GNU libiconv. Cela se soldera probablement par des résultats plus cohérents.
– Introduction de la documentation de PHP à iconv
Les détails sur l'implémentation de iconv utilisée par PHP sont inclus dans la sortie de la fonction phpinfo
.
(Je ne peux pas recompiler PHP avec la bonne bibliothèque iconv sur le serveur avec lequel je travaille pour ce projet donc la réponse que j'ai acceptée ci-dessous est celle qui était la plus utile pour supprimer les accents sans le support de iconv.)
0 votes
Notez que si vous exécutez ceci sur une chaîne qui n'est pas en ASCII, cela aura des effets dramatiques. Par exemple, une chaîne russe ne fonctionnera pas avec ASCII.
0 votes
J'ai la version de glibc installée et le paramétrage de la langue fonctionne pour moi.
0 votes
Alors vous avez dû le compiler? Je ne trouve nulle part de paquet deb. Exactement à cause de la raison que "IT'S" est déjà dans glibc :-(
1 votes
Ce gars suggère une solution astucieuse en utilisant htmlentities(). Désolé, c'est en français, mais vous avez juste besoin des petites fonctions en bas du document : weirdog.com/blog/php/… Vraiment intelligent :)
1 votes
Pour ceux qui veulent voir le code dont @JFG parle, vous pouvez également le trouver ici: github.com/ICanBoogie/Common/blob/…
0 votes
utilphp/php::remove_accents('Àccent') # => Accent
- brandonwamboldt.github.io/utilphp/#remove_accents