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);
La sortie que je m'attendrais serait quelque chose comme ceci:
F'oo Bar
Cependant, au lieu d'être transcrits en caractères sans accent, les caractères accentués sont remplacés par des points d'interrogation:
F?? B?r
Tout ce que je trouve en ligne indique que le paramétrage de la localisation résoudrait ce problème, cependant je le fais déjà. J'ai déjà vérifié les détails suivants:
- La localisation que je paramètre est supportée par le serveur (incluse dans la liste produite par
locale -a
) - Les encodages source et cible (UTF-8 et ASCII) sont supportés 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 retourne'en_US.utf8'
plutôt queFALSE
)
La cause du problème:
Le serveur utilise une 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 attendez. Dans ce cas, il serait judicieux d'installer la bibliothèque GNU libiconv. Il aboutira probablement à des résultats plus cohérents.
– Introduction de la fonction iconv du manuel PHP
Des détails sur l'implémentation de iconv utilisée par PHP sont inclus dans la sortie de la fonction phpinfo
.
(Je ne suis pas en mesure de recompiler PHP avec la bonne bibliothèque iconv sur le serveur sur 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 prise en charge d'iconv.)
0 votes
Notez que si vous exécutez ceci sur une chaîne qui ne peut pas être en ASCII, cela aura des effets dramatiques. Par exemple, une chaîne russe ne fonctionnera pas avec ASCII.
0 votes
J'ai la version glibc installée et le réglage de la locale fonctionne pour moi.
0 votes
Alors vous avez dû le compiler? Je ne trouve pas de paquet deb nulle part. Exactement à cause de la raison que "C'EST" dans glibc déjà :-(
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 astucieux :)
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