J'essaie de supprimer les accents des caractères de la chaîne PHP comme première étape pour rendre la chaîne utilisable dans une URL.
J'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'attendais serait quelque chose comme ceci:
F'oo Bar
Cependant, au lieu que les caractères accentués soient translittérés, ils sont remplacés par des points d'interrogation:
F?? B?r
Tout ce que je peux trouver en ligne indique que la configuration des paramètres régionaux résoudra ce problème, mais je le fais déjà. J'ai déjà vérifié les détails suivants:
- Le paramètre régional que je suis en train de définir est pris en charge par le serveur (inclus dans la liste produite par
locale -a
) - Les encodages source et cible (UTF-8 et ASCII) sont pris en charge par la version serveur de iconv (inclus dans la liste produite par
iconv -l
) - La chaîne d'entrée est encodée en UTF-8 (vérifiée à l'aide de la
mb_check_encoding
fonction PHP , comme suggéré dans le 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 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 prévu. Dans ce cas, ce serait une bonne idée d'installer la bibliothèque GNU libiconv. Cela aboutira probablement à des résultats plus cohérents.
- Introduction du manuel PHP à iconv
Les détails sur l'implémentation iconv utilisée par PHP sont inclus dans la sortie de la phpinfo
fonction.
(Je ne suis pas en mesure de recompiler PHP avec la bibliothèque iconv correcte sur le serveur avec lequel je travaille pour ce projet, donc la réponse que j'ai acceptée ci-dessous est celle qui a été la plus utile pour supprimer les accents sans le support iconv.)
Réponses:
Je pense que le problème ici est que vos encodages considèrent ä et å des symboles différents de «a». En fait, la documentation PHP pour strtr propose un exemple pour supprimer les accents de manière laide :(
http://ie2.php.net/strtr
la source
mb_strstr
est la mauvaise fonction, et il n'y a pasmb_strtr
Qu'en est-il de la mise en œuvre de WordPress ?
Pour mieux comprendre ce que fait cette fonction, consultez cette table de conversion correspondante ici:
Vous pouvez générer vous-même cette table de conversion en répétant simplement le
$chars
tableau de la fonction:la source
C'est un morceau de code que j'ai trouvé et que j'utilise souvent:
la source
strtr()
ne prend pas en compte le multi-octet, si votre fichier de script est encodé dans un format multi-octets (par exemple UTF-8), cette fonction produit des résultats erronés.ů, ž, ř, č, ...
Version conviviale UTF-8 de la fonction simple publiée ci-dessus par Gino:
J'ai dû en venir à cela car mon document php était encodé en UTF-8.
J'espère que ça aide.
la source
si vous avez http://php.net/manual/en/book.intl.php disponible, cela a résolu votre problème
la source
Lower()
n'est pas nécessaire dans ce casLors de l'utilisation
iconv
, le paramètre locale doit être défini:Rend:
Un autre local, puis cs_CZ et en_US, je n'ai pas installé et je ne peux pas le tester.
En C #, je vois une solution utilisant la traduction en forme normalisée unicode - les accents sont divisés puis filtrés via la catégorie unicode sans espacement.
la source
Le moyen le plus simple est d'utiliser la
iconv()
fonction native PHP.la source
echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'usuario o contraseña incorrectos');
sorties très fiablesusuario o contrase?a incorrectos
setlocale(LC_CTYPE, 'cs_CZ'); echo iconv('UTF-8', 'ASCII//TRANSLIT', "usuario o contraseña incorrectos"); // output: usuario o contrasena incorrectos
. Veuillez consulter la documentation PHP pour plus d'informations. Tout y est! php.net/manual/en/function.iconv.phpEn effet, c'est une question de goût. Il existe de nombreuses saveurs pour convertir de telles lettres.
la source
Vous pouvez utiliser urlencode. Ne fait pas tout à fait ce que vous voulez (supprimer les accents), mais vous donnera une chaîne URL utilisable
En Perl, je pourrais utiliser une regex de traduction, mais je ne peux pas penser à l'équivalent PHP
etc...
vous pouvez le faire en utilisant preg_replace
(Veuillez noter que cela a été tapé à partir d'une bière brumeuse montée vendredi après midi, donc peut ne pas être correct à 100%)
ou vous pouvez créer une table de hachage et effectuer un remplacement en fonction de cela.
la source
voici une fonction simple que j'utilise habituellement pour supprimer les accents:
la source
Je suis d'accord avec le commentaire de Georgebrock.
Si vous trouvez un moyen de faire fonctionner // TRANSLIT, vous pouvez créer des URL conviviales:
$url = preg_replace( '/(\w)[^\w\s](\w)/', '$1$2', $url );
$url = preg_replace( '/[^a-z0-9]+/', '-', $url );
$url = preg_replace( '-'
par exemple'/(?:(^|\-)\-+|\-$)/', '', $url );
Si vous ne pouvez pas le faire fonctionner, remplacez setp 1 par un remplacement basé sur strtr / caractère, comme la solution de Xetius.
la source
Je ne peux pas reproduire votre problème. J'obtiens le résultat attendu.
Comment utilisez-vous exactement
mb_detect_encoding()
pour vérifier que votre chaîne est en fait UTF-8?Si j'appelle simplement
mb_detect_encoding($input)
à la fois une version encodée UTF-8 et ISO-8859-1 de votre chaîne, les deux renvoient "UTF-8", donc cette fonction n'est pas particulièrement fiable.iconv()
me donne un "avis" PHP quand il obtient la chaîne mal encodée et ne fait écho qu'à "F", mais cela pourrait être simplement à cause de différents paramètres / versions de PHP / iconv (?).Je vous suggère d'essayer d'appeler d'
mb_check_encoding($input, "utf-8")
abord pour vérifier que votre chaîne est vraiment UTF-8.Je pense que ce n'est probablement pas le cas.la source
Fusion de l'implémentation de Cazuma Nii Cavalcanti avec la liste des personnages de Junior Mayhé, dans l'espoir de gagner du temps pour certains d'entre vous.
la source
Je viens de créer une méthode removeAccents basée sur la lecture de ce fil et de cet autre aussi ( Comment supprimer les accents et transformer les lettres en caractères ASCII "simples"? ).
La méthode est ici: https://github.com/lingtalfi/Bat/blob/master/StringTool.md#removeaccents
Les tests sont ici: https://github.com/lingtalfi/Bat/blob/master/btests/StringTool/removeAccents/stringTool.removeAccents.test.php ,
et voici ce qui a été testé jusqu'à présent:
et il ne convertit que les choses accentuées (lettres / ligatures / cédilles / quelques lettres avec une ligne passant par / ...?).
Voici le contenu de la méthode: ( https://github.com/lingtalfi/Bat/blob/master/StringTool.php#L83 )
la source
Dans laravel, vous pouvez simplement utiliser
str_slug($accentedPhrase)
et si vous vous souciez du tiret (-) que cette méthode remplace par un espace, vous pouvez utiliserstr_replace('-', ' ', str_slug($accentedPhrase))
la source
str_slug($word, ' ');
Quelque chose comme ça?
la source
Si la tâche principale est simplement d'utiliser la chaîne dans une URL, pourquoi ne pas utiliser slugyfier ?
puis
Il a également de nombreux ponts pour les frameworks populaires. Par exemple, vous pouvez utiliser le comportement Sluggable Extensions de Doctrine pour générer automatiquement un slug unique pour chaque entité dans DB et l'utiliser dans l'URL.
Si vous voulez simplement effacer tous les accents, vous pouvez jouer avec des ensembles de règles pour satisfaire les exigences.
la source
Vous pouvez utiliser un style tableau clé => valeur à utiliser avec strtr () en toute sécurité pour les caractères UTF-8, même s'ils sont multi-octets.
De plus, vous enregistrez le décodage / l'encodage dans la partie UTF-8.
la source
Une version améliorée de la
remove_accents()
fonction selon la dernière version de formatage de Wordpress 4.3 est:Ma réponse est une mise à jour de la solution @dynamic puisque les signes diacritiques roumains ou peut-être d'autres langues n'ont pas été convertis. J'ai écrit les fonctions minimales et fonctionne comme un charme.
la source
la source
Sur la base de la réponse @Mimouni, j'ai créé cette fonction pour translittérer les chaînes accentuées en chaînes non accentuées.
la source
Quel est le problème avec celui-ci? Fonctionne avec UTF8
Cela peut être plus rapide en ne l'utilisant pas
preg_replace
, mais la vitesse n'était pas mon objectif ici.la source
Cette réponse, j'ai les conseils suivants ici, donc ce n'est pas vraiment le mien. Cela fonctionne pour moi en utilisant LATIN1 ou UTF-8. Si vous utilisez d'autres jeux de caractères, vous devriez probablement les ajouter à
mb_detect_encoding
function. Un environnement correct est probablement également nécessaire.la source
Fóø Bår
, en fait, je n'ai fait queFo? Bar
. Impossible deø
traduire le caractère eno
. J'ai essayé de changer mon environnement en no_NO, da_DK, mais cela n'a pas interféré. En utilisantsetlocale(LC_CTYPE,'da_DK')
je l'aiFo? Baar
.L'une des astuces sur lesquelles je suis tombé sur le Web consistait à utiliser htmlentities puis à supprimer le caractère encodé:
Pas parfait mais cela fonctionne bien dans certains cas.
Mais, vous écrivez sur la création d'une chaîne d'URL, donc urlencode et son homologue urldecode peuvent être meilleurs. Ou, si vous créez une chaîne de requête, utilisez cette dernière fonction: http_build_query .
la source
L'implémentation de WordPress est définitivement la plus sûre pour les chaînes UTF8. Pour les chaînes Latin1, un simple strtr fait le travail, mais assurez-vous que vous enregistrez votre script au format LATIN1, pas UTF-8.
la source
la source