Cuando una interfaz muestra &, " o caracteres rotos, la tentación es añadir una llamada de decode. A veces funciona visualmente, pero puede empeorar la causa real. Los bugs de encoding suelen indicar que varias capas no saben si un valor es texto semántico, source HTML o salida ya escapada. La calidad de datos depende de definir esa propiedad desde el inicio.

Define el valor canónico almacenado

Para nombres, descripciones y mensajes, la base debería guardar texto Unicode normal, no HTML encoded. El valor “A & B” como contenido sigue siendo una cadena con ampersand. HTML lo escapa al renderizar; JSON aplica reglas JSON; email de texto lo muestra tal cual.

Guardar entidades HTML en campos normales ata los datos a un canal de presentación. Buscar, editar, exportar y comparar se vuelven más difíciles.

Rich HTML es otro tipo de dato

Si una aplicación almacena HTML formateado, ese campo debe nombrarse y tratarse como markup sanitizado. No debe mezclarse con campos de texto plano ni renderizarse raw sin política. Separar tipos evita que cada desarrollador adivine mirando la string.

Schemas, convenciones de nombres y tipos fuertes ayudan. Un campo body_html comunica más que un genérico content.

Decodifica solo cuando el contrato lo dice

Entity decoding es correcto si la fuente declara que envía HTML character references. Aplicarlo a texto arbitrario puede convertir secuencias visibles en caracteres con significado de markup. Repetir decode es especialmente peligroso porque puede revelar HTML ejecutable.

Las APIs deben especificar si un campo contiene plain text o HTML. El consumidor no debe inferirlo por presencia de < o ampersands.

Double encoding revela ownership duplicado

Si backend escapa y template vuelve a escapar, las entidades se muestran al usuario. El arreglo correcto suele ser quitar el escaping temprano y dejar que la capa final lo haga según contexto. Decodificar en browser solo mueve el problema.

Auto-escaping funciona mejor cuando recibe valores sin escapar. Raw output se reserva para HTML confiable y sanitizado.

Charset y entidades son problemas distintos

Texto como café suele indicar bytes leídos con charset incorrecto, no un problema de entidades. HTML entities representan caracteres dentro de markup; UTF-8 define cómo esos caracteres se vuelven bytes.

Conexiones de base, archivos, headers HTTP y serializers deben usar UTF-8 de forma consistente. Reemplazos masivos sin mirar bytes pueden destruir datos correctos.

Migraciones legacy requieren clasificación

Una columna antigua puede mezclar texto plano, entidades y valores doblemente codificados. Un decode global puede romper entradas que el usuario escribió intencionalmente. La migración debe muestrear, clasificar patrones, guardar backup y tener rollback.

Después del cleanup, los write paths deben enforcing la nueva representación. Si un importer viejo sigue enviando HTML encoded, la deuda vuelve.

Exports y webhooks necesitan contrato propio

Un CSV o webhook puede convertirse en fuente para otro sistema. Si contiene texto HTML-encoded sin decirlo, el consumidor puede guardar entidades como contenido o decodificar de forma peligrosa. Cada salida debe declarar si el campo es plain text, HTML sanitizado o presentación ya renderizada.

Cuando se necesitan ambas cosas, expón dos campos. Un único string sobrecargado obliga a clientes a adivinar y repetir errores.

Los editores deben preservar intención

Un editor de texto plano no debería convertir secuencias parecidas a entidades solo porque las reconoce. Un editor HTML sí puede normalizar markup, pero entonces debe mostrar preview del resultado sanitizado y no prometer que conservará source exacto.

La diferencia importa para auditoría. Si el usuario cambió una palabra, el historial debería mostrar esa edición, no cientos de transformaciones automáticas de encoding.

La reparación necesita provenance

Durante cleanup, saber de qué importer, campaña o periodo vino cada valor evita reglas globales peligrosas. Un origen puede haber enviado texto plano, otro HTML encoded y otro contenido ya doblemente codificado. Provenance permite corregir por grupos y verificar muestras antes de escribir cambios permanentes.

Después de reparar, bloquea el write path defectuoso. Limpiar datos sin cerrar la fuente solo aplaza el próximo ciclo de artifacts visibles.

La búsqueda sufre con datos mezclados

Dos valores que se ven iguales pueden no coincidir en storage si uno está encoded. Eso afecta búsqueda, deduplicación, sorting y analítica. Mantener texto semántico permite que índices trabajen sobre lo que el usuario realmente ve.

Escaping de presentación ocurre después de leer, no se escribe de vuelta como si fuera edición del dato.

Los tests de round trip muestran la verdad

Pasa valores representativos por input, storage, API, editor y rendering final. Incluye ampersands, comillas, texto no latino, secuencias parecidas a entidades y markup permitido. Verifica lo que ve el usuario y lo que permanece guardado.

También prueba búsqueda y exportación después del round trip. Un valor puede verse correcto en pantalla y aun así quedar dañado para analytics o integraciones.

Encoding y decoding son operaciones de frontera, no herramientas generales de limpieza. Cuando plain text, HTML, URL y datos serializados tienen contratos claros, desaparecen la mayoría de artefactos y se reduce el riesgo de inyección.