Los ampersands "&" y las URLS
Hace unos días validando el xhtml de una web, me encontré con el siguiente error cannot generate system identifier for general entity "loquesea".
, revisé el error y se trataba de una URL que llevaba parametros por GET, aparentemente todo estaba correcto y no comprendía a que venía el error, así que me puse a leer un artículo muy útil al que te remitía la WDG explicando los errores más comunes a la hora de validar el código.
Por lo visto siempre que escribamos el caracter & debemos hacerlo con su codificación en html &, al escribir el caracter directamente sin su código los navegadores intentan sustituirlo por un caracter especial, en la mayoría de los casos esto no será posible y lo escribirán tal cual asumiendo que es lo que deseaba mostrar el programador, pero hay ciertos casos donde sí puede ser sustituido y no encontraremos con algo inesperado.
Veamos por ejemplo la siguiente URL que se encarga de mostrar una ficha de un registro "http://www.your-site.com/njavascript:void(0)ews.php?layout=1®=45", seguro que nuestra intención es enviar a la url las variables layout y reg mediante GET, pero el navegador al interpretar el html intentará sustituir ®=45 por un código, en este caso por ®, es decir, el caracter ®.
Esto sucede en todo el html incluido los atributos como href de los links, así que cualquier variable cuyo nombre pueda ser reemplazado por un caracter especial ocasionará problemas, por ejemplo, &lang=en se reemplazará por
〈=en
<!-- This is invalid! -->
<a href="foo.cgi?chapter=1§ion=2©=3&lang=en">...</a>
<a href="foo.cgi?chapter=1&section=2&copy=3&lang=en">...</a>