W3docs

Atributo HTML accept-charset

El atributo HTML accept-charset especifica la codificación de caracteres que debe usarse al enviar un formulario. Aprende a usarlo en el elemento <form>.

El atributo HTML accept-charset especifica la codificación de caracteres (charset) que el navegador debe usar cuando envía un formulario al servidor.

Este atributo solo puede utilizarse en el elemento <form> — no tiene ningún significado en campos de entrada, botones ni ninguna otra etiqueta. Su valor es una lista de una o más codificaciones de caracteres separadas por espacios o comas. El valor predeterminado es UNKNOWN, que indica al navegador que use la misma codificación que el documento que contiene el formulario. Nunca es necesario escribir accept-charset="UNKNOWN" de forma literal: ese valor predeterminado es el que se obtiene omitiendo el atributo por completo.

Por qué existe este atributo

Para entender accept-charset, hay que imaginar la web antes de que UTF-8 se volviera universal. A finales de los años 90 y durante los 2000, los documentos solían servirse con codificaciones de un solo byte como ISO-8859-1 (Europa occidental), Shift_JIS (japonés) o windows-1251 (cirílico). Una página en una codificación podía enviar datos a un servidor que esperaba otra, y un campo de formulario con caracteres que la codificación de destino no podía representar llegaba al servidor como bytes ilegibles (mojibake). accept-charset era la vía de escape: permitía al autor indicar "codifica el envío de este formulario como este charset, independientemente de la codificación que use la propia página".

Esa discrepancia es la única situación en la que el atributo alguna vez importó: una página con una codificación heredada que alimentaba un backend que esperaba una diferente. Una vez que toda la cadena se estandarizó en UTF-8, el problema desapareció.

Importante: este atributo es prácticamente una no-operación hoy en día. En la práctica, todos los navegadores modernos envían los datos de formularios usando la codificación propia del documento — UTF-8 en cualquier página moderna — independientemente de accept-charset. (El algoritmo de envío de formularios HTML sí define cómo se elegiría una codificación de la lista, pero como hoy las páginas y los navegadores son UTF-8 de extremo a extremo, el atributo no cambia nada.) Para páginas nuevas, la forma fiable de controlar la codificación es servir el documento como UTF-8 (con <meta charset="UTF-8">) y dejar que el navegador envíe UTF-8 — casi nunca se necesita accept-charset.

Sintaxis

<form accept-charset="character_set"></form>

Valores comunes de juego de caracteres

ValorDescripción
UTF-8Codificación Unicode universal. El comportamiento predeterminado de todos los navegadores modernos y el valor recomendado para prácticamente todos los formularios.
ISO-8859-1Latin-1, una codificación heredada de 8 bits para idiomas de Europa occidental. No puede representar la mayoría de los caracteres no latinos; solo relevante para sistemas antiguos.
UNKNOWNEl valor predeterminado. Indica al navegador que use la misma codificación que el documento que contiene el formulario.

Se puede listar más de una codificación (por ejemplo, accept-charset="UTF-8 ISO-8859-1"); se espera que el navegador elija la primera que pueda admitir. En los navegadores modernos, esta lista se ignora en la práctica.

Uso moderno y correcto

Para prácticamente cualquier formulario que se escriba hoy en día, el enfoque correcto es no hacer nada especial: servir la página como UTF-8 y omitir accept-charset. El formulario enviará UTF-8 automáticamente, que es lo que el servidor debería esperar.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Contact form</title>
  </head>
  <body>
    <!-- No accept-charset needed: UTF-8 page submits as UTF-8 -->
    <form action="/contact" method="post">
      <input type="text" name="name" placeholder="Your name" />
      <input type="email" name="email" placeholder="Your email" />
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

Si se prefiere ser explícito, escribir accept-charset="UTF-8" es inofensivo y documenta la intención — pero no cambia nada, porque UTF-8 ya es el comportamiento predeterminado.

Ejemplo del atributo HTML accept-charset

El siguiente ejemplo establece accept-charset="ISO-8859-1", una codificación heredada, para ilustrar la sintaxis del atributo. Nótese que los navegadores actuales enviarán este formulario como UTF-8 de todos modos — esto es una demostración, no una recomendación.

<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
    <style>
      input {
        display: block;
        margin-bottom: 10px;
      }
    </style>
  </head>
  <body>
    <form action="/form/submit" accept-charset="ISO-8859-1" method="post">
      <input type="text" name="name" placeholder="Enter your Name" />
      <input type="text" name="surname" placeholder="Enter your Surname" />
      <input type="number" name="age" placeholder="Enter your Age" />
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

Atributos de formulario relacionados

El atributo accept-charset funciona junto con los demás atributos que se establecen en un elemento <form>:

  • action — la URL a la que se envían los datos del formulario.
  • method — el método HTTP (GET o POST) utilizado para enviar el formulario.
  • Etiqueta <form> — el elemento contenedor al que pertenecen estos atributos.

El atributo relacionado enctype (establecido en el elemento <form>) controla cómo se codifican los datos del formulario (por ejemplo, multipart/form-data para la carga de archivos), lo cual es un aspecto independiente de la codificación de caracteres que describe accept-charset. Consulta el capítulo HTML Forms para una visión completa, incluido enctype.

¿Qué pasa si realmente debo admitir un servidor heredado que no usa UTF-8?

Dado que los navegadores ignoran accept-charset, no es posible forzar que una página UTF-8 envíe ISO-8859-1 (u otro charset) simplemente estableciendo el atributo — ese camino no lleva a ningún lado. Si se trabaja con un backend antiguo que solo entiende una codificación de un solo byte, la solución correcta está en el servidor, no en el HTML:

  • Convertir en el servidor. Recibir el envío en UTF-8 y transcodificarlo a la codificación heredada que necesita la aplicación (por ejemplo, con mb_convert_encoding de PHP, bytes.decode/encode de Python, o el equivalente en la plataforma correspondiente). Este es el enfoque moderno y recomendado.
  • Migrar el backend a UTF-8 siempre que sea posible — elimina por completo esa clase de problema de forma permanente.

Tratar el envío como UTF-8 en la comunicación y convertirlo en el punto de entrada es fiable; depender de accept-charset para que lo haga por sí solo no lo es.

Práctica

Práctica
¿Qué es el atributo HTML 'accept-charset'?
¿Qué es el atributo HTML 'accept-charset'?
Práctica
¿En qué elemento se puede usar el atributo accept-charset?
¿En qué elemento se puede usar el atributo accept-charset?
Práctica
¿Qué ocurre en un navegador moderno si se omite accept-charset en una página UTF-8?
¿Qué ocurre en un navegador moderno si se omite accept-charset en una página UTF-8?
Was this page helpful?