Decodificar entidades HTML

Pega texto con referencias de carácter y lee lo que dice. Se reconocen las de nombre, las decimales y las hexadecimales. Importa más cómo se hace: con una tabla y no metiendo tu texto en un elemento para preguntarle al navegador — esa diferencia es la que decide si un marcado ajeno puede hacer algo mientras lo decodificas.

Resultado

La respuesta aparece aquí mientras escribes.

  • Dónde se ejecuta

    No se sube nada, porque no hay archivo: se calcula en esta misma página.

  • Sin cola y sin cuenta

    Responde tan rápido como dé tu máquina, y nunca pregunta quién eres.

  • Tantas veces como quieras

    No se cuenta nada ni se limita nada: volver a responder no nos cuesta nada.

Cómo funciona

  1. Pega el texto con las referencias de carácter.
  2. Lee el resultado. Lo que no se reconozca o esté incompleto se queda como está, en vez de desaparecer en silencio.
  3. Copia lo que necesites. No se ha subido nada.

Con una tabla, y no con un analizador

La forma obvia de resolver entidades es escribir el texto en un elemento y leer su `textContent`. Es también la forma en que la mitad de las herramientas de este género se abren un agujero: un `<img src=x onerror=...>` dentro del texto se convierte en un elemento real, y según el método eso provoca una petición de red o ejecuta código.

Aquí no pasa, porque no se genera HTML en ningún momento. Las referencias se resuelven contra una tabla y las numéricas se calculan: no hay punto alguno en el que tu texto se interprete como marcado. Por eso mismo esta página no puede ofrecer una vista previa — sería volver justo a lo que se está evitando.

Tres formas que aparecen todas

Una referencia empieza por `&` y termina en `;`. En medio va un nombre como `amp` o `nbsp`, una almohadilla con un número decimal como `#241`, o una almohadilla con `x` y un hexadecimal como `#xF1`. Las dos últimas designan el mismo punto de código en dos bases.

En la práctica aparecen las tres en el mismo archivo, porque las han producido piezas distintas: los gestores de contenido tienden a las de nombre, las exportaciones a las decimales, las herramientas de XML a las hexadecimales. Aquí se tratan igual, así que no necesitas saber qué parte de tu cadena tenía cada preferencia.

El punto y coma que falta

Los navegadores son generosos: un `&amp` sin punto y coma lo resuelven igual en muchos contextos, porque las páginas antiguas lo escribían así y ganó la compatibilidad. Esa indulgencia está incluso recogida en el estándar de HTML, pero solo para una lista limitada de nombres y no dentro de valores de atributo.

Para ti significa que un `&amp` sin punto y coma en tus datos es una bomba de relojería, porque distintos procesadores lo tratan distinto. Esta herramienta exige el punto y coma y deja las referencias incompletas donde están: lo que queda visible es justo el sitio donde algo se generó mal.

Por qué a veces hay que decodificar dos veces

Si en el resultado sigue habiendo un `&lt;`, la entrada estaba doblemente codificada: contenía `&amp;lt;`, y una pasada produce correctamente `&lt;`. No es un resultado a medias, es el correcto — un decodificador que siguiera hasta que nada pareciera una entidad destrozaría también el texto donde `&lt;` estaba escrito a propósito.

Lo limpio es volver a pasar el texto sabiendo que lo estás haciendo. Si te hacen falta dos pasadas de forma habitual, la tarea real es encontrar la doble codificación en la cadena que lo genera, no pulsar dos veces aquí.

De dónde salen las entidades dobles

Casi siempre de un valor que se guardó escapado y que el motor de plantillas volvió a escapar al mostrarlo. Las dos etapas son correctas por separado; lo incorrecto es que sean dos. Solo se ve en la página final, donde las usuarias leen `&nbsp;` como texto.

La segunda fuente son las importaciones y migraciones: los datos de un sistema antiguo llegan ya escapados y la rutina nueva los trata como si vinieran en crudo. También se reconoce por el `&amp;` delante de otros nombres de entidad — es la firma de dos capas superpuestas.

Más de dos mil nombres, y la lista está cerrada

HTML5 define más de 2.200 referencias con nombre, desde `&amp;` y `&copy;` hasta símbolos matemáticos que casi nadie escribe. La lista está congelada a propósito: no se añaden nuevas, porque cada añadido cambiaría documentos que ya existen.

En la práctica: si un nombre no se resuelve aquí, o está mal escrito o nunca existió. Los caracteres nuevos ya no reciben nombre; para todo lo que Unicode ha añadido desde 2014 solo existe la forma numérica. Un `&emoji;` no ha existido nunca y no va a existir.

Referencias numéricas más allá del plano básico

Los puntos de código por encima de `FFFF` — emoji, escrituras poco frecuentes, algunos símbolos matemáticos — necesitan internamente dos unidades en JavaScript, un par sustituto. Un decodificador que no lo tenga en cuenta produce dos medios caracteres rotos en lugar de uno completo.

A veces también aparecen referencias que escriben cada mitad del par por separado, porque una herramienta antigua codificó así. Esos valores son Unicode inválido en sentido estricto; aquí no se convierten en silencio a un carácter de sustitución, para que se vea que el problema está en el origen y no en la visualización.

El espacio que no se ve

Un `&nbsp;` se convierte en un carácter que parece un espacio y no lo es: tiene el punto de código `A0` en lugar de `20`. Por eso después falla una comparación, un buscar y reemplazar o un `trim()`, sin que en pantalla haya nada sospechoso.

Es el fallo más pesado de esta familia precisamente porque es invisible. Quien procese texto copiado de un gestor de contenidos o de un procesador de textos debe contar con ello: Word y la mayoría de los editores visuales ponen espacios duros con generosidad. Si dos valores «obviamente iguales» no se comparan como iguales, ese es el primer sitio donde mirar.

Qué significa esto para el RGPD

A este campo llega con frecuencia texto de terceros: un extracto de base de datos, un ticket de soporte, una entrada de un feed con nombres y direcciones dentro. Como la resolución ocurre en la página, nada de eso se nos comunica ni genera un encargo de tratamiento.

Conviene además recordar que el texto decodificado es, por definición, menos inofensivo que el escapado — el escape era la protección. Quien vaya a devolverlo a una página tiene que escaparlo otra vez para el sitio donde acabe; esta es una herramienta de lectura y no el último paso de una cadena que sirve HTML.

Decodificar entidades HTML: preguntas frecuentes

¿Por qué sigue apareciendo `&lt;` en el resultado?

Porque la entrada estaba doblemente codificada: contenía `&lt;` y una pasada produce correctamente `<`. Vuelve a pasarla si es lo que quieres, y busca después en la cadena que lo genera la etapa que escapa dos veces.

¿Por qué no se resuelve `&amp` sin punto y coma?

Porque sin punto y coma la referencia no es inequívoca. Los navegadores son indulgentes por compatibilidad, pero no de forma uniforme; aquí se deja como está para que se vea dónde se generó algo mal.

¿Puede un marcado ajeno hacer algo aquí?

No. Las referencias se resuelven contra una tabla y las numéricas se calculan; en ningún momento se genera HTML. Por eso mismo tampoco hay vista previa renderizada.

¿Qué es el carácter invisible que sale de `&nbsp;`?

Un espacio duro con el punto de código A0. Parece un espacio normal pero es otro carácter, así que las comparaciones, los buscar y reemplazar y las funciones de recorte no lo tratan como espacio en blanco.

¿Sale de mi equipo el texto?

No. Todo ocurre en esta página; no hay ningún servidor decodificando. El panel de red lo confirma mientras escribes.

Otras herramientas