web-dev-qa-db-fra.com

Décodage d'URL en PHP

J'essaie de décoder cette chaîne d'URL en utilisant la fonction urldecode de PHP:

urldecode("Ant%C3%B4nio+Carlos+Jobim");

Ceci est censé produire ...

'Antônio Carlos Jobim'

... mais élimine plutôt cela

'Antônio Carlos Jobim'

J'ai testé la chaîne dans un décodeur en ligne basé sur JS avec un grand succès, mais je n'arrive pas à faire cette opération côté serveur. Des idées?

31
Brandon Jackson

Votre chaîne est aussi UTF-8 codé. Cela fonctionnera:

echo utf8_decode(urldecode("Ant%C3%B4nio+Carlos+Jobim"));

Sortie: "Antônio Carlos Jobim".

60
Kristoffer Bohmann

En fait, vous obtenez le résultat souhaité, mais cela n’est pas interprété comme UTF-8. S'il s'agit d'une application HTTP, vous devez envoyer un en-tête ou une balise méta (ou les deux) indiquant au client d'utiliser UTF-8.

Edit: par exemple:

// replace text/html with the content type you're using
header('Content-Type: text/html; charset=UTF-8');
13
Ignas R

quand je fais

<?php
echo urldecode("Ant%C3%B4nio+Carlos+Jobim");
?>

Son affichage correctement dans mon navigateur comme

Antônio Carlos Jobim

J'ai testé avec XAMPP

2
YOU

Utilisez-vous également htmlenteties avant de le renvoyer à la page? Lorsque je viens de tester votre code, cela fonctionnait bien avec uniquement la partie urldecode("Ant%C3%B4nio+Carlos+Jobim");, mais lorsque je l'ai exécuté dans htmlentities, j'ai obtenu le même résultat que vous.

Cela semble être un problème avec les caractères UTF-8 et la façon dont PHP gère la fonction htmlentities

1
Doug Neiner

une autre option est:

<?php
$smthing = 'http%3A%2F%2Fmysite.com';
$smthing = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($smthing)); 
$smthing = html_entity_decode($smthing,null,'UTF-8');
echo $smthing;
?>

la sortie devient: http://mysite.com

0
T.Todua