¿Cuáles son los caracteres especiales HTML y XML?

¿Cuáles son las entidades especiales de caracteres reservados en HTML y en XML?

La información que tengo dice:

HTML:

  • & (reemplace con & )
  • < (reemplace con < )
  • > (reemplace con > )
  • " (reemplace con " )
  • ' (reemplace con ' )

XML:

  • < (reemplace con < )
  • > (reemplace con > )
  • & (reemplace con & )
  • ' (reemplace con ' )
  • " (reemplace con " )

Pero no puedo encontrar documentación sobre ninguno de estos.

El W3C menciona, en Extensible Markup Language (XML) 1.0 (Quinta Edición) , ciertas referencias de entidades predefinidas. Pero dice que estas entidades están predefinidas (de la misma manera que © está predefinido); no es que se deben escapar:

4.6 Entidades predefinidas

[Definición: Las referencias de entidad y de carácter se pueden usar para escapar del corchete angular izquierdo, el símbolo comercial y otros delimitadores. Se especifica un conjunto de entidades generales (amp, lt, gt, apos, quot) para este propósito. Las referencias de caracteres numéricos también se pueden usar; se expanden inmediatamente cuando se reconocen y deben tratarse como datos de caracteres, por lo que las referencias de caracteres numéricos “& # 60;” y “& # 38;” pueden usarse para escapar <y & cuando se producen en datos de caracteres.]

¿Qué caracteres se deben escapar a las referencias de entidad en HTML ?
¿Qué caracteres deben escaparse en referencias de entidad en XML ?


Actualización :

De Extensible Markup Language (XML) 1.0 (Quinta Edición) :

2.4 Datos de carácter y marcado

El carácter ampersand ( & ) y el paréntesis angular izquierdo ( < ) no deben aparecer en su forma literal, excepto cuando se utilizan como delimitadores de marcado, o dentro de un comentario, una instrucción de procesamiento o una sección CDATA.
Si se necesitan en otro lugar, deben escaparse usando referencias de caracteres numéricos o las cadenas ” & ” y ” < “, respectivamente.

El corchete de ángulo recto ( > ) se puede representar con la cadena ” > ” y debe , por compatibilidad, escaparse usando ” > ” o una referencia de carácter cuando aparezca en la cadena ” ]]> ” en contenido, cuando esa cadena no marca el final de una sección CDATA.

Para permitir que los valores de los atributos contengan comillas simples y dobles, el carácter de apóstrofo o de comillas simples ( ' ) se puede representar como ” ' ” y el carácter de comillas dobles ( " ) como” " “.

Leí el primero diciendo que

debe ser :

  • < ( < ) debe ser
  • & ( & ) debe ser

puede , pero debe aparecer cuando ]]>

  • > ( > ) debe ser, si aparece como ]]>

Y eso ' y " no tiene que ser escapado en absoluto, a menos que desee tener citas dentro de los atributos entre comillas.


Desde la especificación HTML 4.01, Representación del documento HTML :

5.3.2 Referencias de entidades de caracteres

Los autores que deseen poner el carácter ” < ” en el texto deben usar ” < ” (ASCII decimal 60) para evitar posibles confusiones con el comienzo de una etiqueta (etiqueta inicial delimitador abierto).

Del mismo modo, los autores deben usar ” > ” (ASCII decimal 62) en el texto en lugar de ” > ” para evitar problemas con agentes de usuario más antiguos que perciben incorrectamente esto como el final de una etiqueta (delimitador de cierre de etiqueta) cuando aparece en valores de atributo entrecomillados .

Los autores deben usar ” & ” (ASCII decimal 38) en lugar de ” & ” para evitar confusiones con el comienzo de una referencia de caracteres (delimitador abierto de referencia de entidad). Los autores también deben usar ” & ” en los valores de los atributos ya que las referencias de caracteres están permitidas dentro de los valores de los atributos CDATA.

Algunos autores usan la referencia de entidad de carácter ” " ” para codificar instancias de la marca de comillas dobles ( " ) ya que ese carácter se puede usar para delimitar los valores de los atributos.

HTML es mucho más débil en las reglas, pero parece que debería :

  • < debería ser con <
  • > debería estar con >
  • & debería ser con &
  • " debería estar con "

y si " puede ser una referencia de entidad, también debería reemplazar ' con &


Actualización dos

Desde HTML5: un vocabulario y API asociadas para HTML y XHTML :

8.3 Serialización de fragmentos HTML

Escapar una cadena (para los fines del algoritmo anterior) consiste en ejecutar los siguientes pasos:

Reemplace cualquier aparición del carácter ” & ” por la cadena ” & “.

Reemplace las ocurrencias del carácter U + 00A0 NO-BREAK SPACE por la cadena ”   “.

Si se invocó el algoritmo en el modo de atributo, reemplace las ocurrencias del carácter ” " “por la cadena” " “.

Si el algoritmo no fue invocado en el modo de atributo, reemplace cualquier ocurrencia del carácter ” < ” por la cadena ” < “, y cualquier ocurrencia del carácter ” > ” por la cadena ” > “.

Lo que leo como HTML :

  • & por & siempre
  •   por   siempre
  • " por " si está dentro de un atributo
  • < por < si no está en un atributo (es decir, los atributos pueden contener < )
  • > por > si no está en un atributo (es decir, los atributos pueden contener > )

En primer lugar, está comparando una especificación HTML 4.01 con una HTML 5 . HTML5 se relaciona más estrechamente con XML que HTML 4.01 (por eso tenemos XHTML), por lo que esta respuesta se mantendrá en HTML 5 y XML.

Sus referencias citadas son consistentes en los siguientes puntos:

  • < siempre debe representarse con < cuando no indica una instrucción de procesamiento
  • > siempre debe representarse con > cuando no indica una instrucción de procesamiento
  • & siempre se debe representar con &
  • excepto cuando está dentro de (que solo se aplica a XML)

Estoy de acuerdo al 100% con esto. Nunca querrá que el analizador malinterprete los literales para obtener instrucciones, por lo que es una idea sólida codificar siempre cualquier carácter que no esté en el espacio (consulte a continuación). Los buenos analizadores saben que cualquier cosa contenida en no son instrucciones, por lo que la encoding no es necesaria allí.

En la práctica, nunca codifico ' o " menos que

  • aparece dentro del valor de un atributo (XML o HTML)
  • aparece dentro del texto de las tags XML. ( "Yoinks!", he said. )

Ambas especificaciones también están de acuerdo con esto.

Entonces, el único punto de disputa es el (espacio). La única mención de esto en cualquiera de las especificaciones es cuando se intenta la serialización. Cuando no, siempre debes usar un literal (espacio). A menos que esté escribiendo su propio analizador, no veo la necesidad de hacer ningún tipo de serialización, así que esto no viene al caso.