web-dev-qa-db-fra.com

Encodage XHTML et & (esperluette)

Mon site Web est conforme à XHTML Transitional sauf pour une chose : le & (esperluette) dans l'URL est écrit tel quel, au lieu de &

Autrement dit, toutes les URL de mes pages sont généralement comme ceci:

<a href="http://www.foo.com/page.aspx?x=1&y=2">Foo</a>

Mais validateur XHTML génère cette erreur:

impossible de générer l'identifiant système pour l'entité générale "y"

... et il veut que l'url soit écrite comme ceci:

<a href="http://www.foo.com/page.aspx?x=1&amp;y=2">Foo</a>

Le problème est que IE et Firefox ne gèrent pas correctement l'URL et ignorent le paramètre y. Comment puis-je faire fonctionner ce lien et le valider correctement?

Il me semble qu'il est impossible d'écrire des pages XHTML si les navigateurs ne fonctionnent pas avec des URL XHTML codées strictes.

Voulez-vous voir en action? Voyez la différence entre ces deux liens (copiez-les et collez-les tels quels):

http://stackoverflow.com/search?q=ff&sort=newest

et

http://stackoverflow.com/search?q=ff&amp;sort=newest
35
Robert

Je viens d'essayer ça. Ce que vous avez tenté de faire est correct. En HTML, si vous écrivez un lien, le & les caractères doivent être codés comme &amp; Vous encoderiez uniquement le & comme %26 si vous vouliez qu'une valeur de paramètre contienne une esperluette. Je viens d'écrire une simple page HTML contenant un lien: <a href="Default2.aspx?param1=63&amp;param2=hel">Click me</a> et cela a bien fonctionné: default2.aspx a reçu les paramètres voulus et la source a réussi la validation.

L'encodage de & comme &amp; est requis en HTML, pas dans le lien. Lorsque le navigateur voit le &amp; dans la source HTML d'un lien, il l'interprétera comme une esperluette et la cible du lien sera comme prévu. Si vous collez une URL dans la barre d'adresse de votre navigateur, elle ne s'attend pas à ce qu'elle soit HTML et n'essaie pas d'interpréter le codage HTML qu'elle peut contenir. C'est pourquoi vos exemples de liens que vous proposez de copier/coller dans un navigateur ne fonctionnent pas et pourquoi nous ne nous attendons pas à ce qu'ils fonctionnent.

Si vous publiez un peu plus de votre code actuel, nous pourrons peut-être voir ce que vous avez fait de mal, mais vous semblez aller dans la bonne direction en utilisant &amp; dans vos balises d'ancrage.

56
pipTheGeek

C'était ma faute: le contrôle Hyperlink était déjà codé &, donc mon URL http://foo?x=1&amp;y=2 a été codé en http://foo?x=1&amp;amp;y=2

Normalement, le & amp à l'intérieur de l'url est correctement géré par les navigateurs, comme vous l'avez indiqué. Merci

6
Robert

vous pourriez utiliser &amp; au lieu de & dans votre URL dans votre page.

Cela devrait lui permettre d'être validé en xhtml strict ...

<a href="http://www.foo.com/page.aspx?x=1&amp;y=2">Foo</a>

Remarque, si elle est utilisée par une fonction ASP.NET Request.QueryString, la chaîne de requête n'utilise pas le codage XML, elle utilise codage URL :

/mypath/mypage?b=%26stuff

Vous devez donc fournir une fonction traduisant '&' en% 26

Remarque: dans ce cas, Server.URLEncode ("neetu & geetu"), qui produirait neetu +% 26 + geetu, n'est pas ce que vous voulez, car vous devez traduire & en% 26, pas seulement '&'. Vous devez ajouter un appel replace () appliqué au résultat URLEncode, afin de remplacer '% 26amp;' par '% 26'.

5
VonC