W3docs

Atributo HTML accept-charset

O atributo HTML accept-charset especifica a codificação de caracteres para o envio de formulários. Veja como usá-lo no elemento <form>.

O atributo HTML accept-charset especifica a codificação de caracteres (charset) que o navegador deve usar ao enviar um formulário para o servidor.

Você pode usar este atributo somente no elemento <form> — ele não tem significado em inputs, botões ou qualquer outra tag. Seu valor é uma lista de uma ou mais codificações de caracteres separadas por espaço ou vírgula. O valor padrão é UNKNOWN, que instrui o navegador a usar a mesma codificação do documento que contém o formulário. Você nunca precisa escrever accept-charset="UNKNOWN" literalmente: esse padrão é o que você obtém ao omitir o atributo completamente.

Por que este atributo existe

Para entender o accept-charset, é preciso imaginar a web antes de o UTF-8 se tornar universal. No final dos anos 1990 e nos anos 2000, documentos eram frequentemente servidos em codificações de byte único como ISO-8859-1 (Europa Ocidental), Shift_JIS (japonês) ou windows-1251 (cirílico). Uma página em uma codificação poderia enviar dados a um servidor que esperava outra, e um campo de formulário contendo caracteres que a codificação de destino não conseguia representar chegaria ao servidor como bytes ilegíveis (mojibake). O accept-charset era a saída: permitia que um autor dissesse "codifique o envio deste formulário como este charset, independentemente da codificação que a própria página utiliza."

Esse desencontro é a única situação em que o atributo chegou a importar — uma página em uma codificação legada alimentando um backend que exigia outra. Uma vez que toda a pilha padronizou o UTF-8, o problema desapareceu.

Importante — este atributo é efetivamente inoperante hoje. Na prática, todos os navegadores modernos enviam dados de formulário usando a própria codificação do documento — UTF-8 para qualquer página moderna — independentemente do accept-charset. (O algoritmo de envio de formulários HTML define como uma codificação listada seria escolhida, mas como hoje as páginas e os navegadores usam UTF-8 de ponta a ponta, o atributo não muda nada.) Para páginas novas, a maneira confiável de controlar a codificação é servir o documento como UTF-8 (com <meta charset="UTF-8">) e deixar o navegador enviar UTF-8 — você quase nunca precisará de accept-charset.

Sintaxe

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

Valores comuns de conjunto de caracteres

ValorDescrição
UTF-8Codificação Unicode universal. O comportamento padrão de todo navegador moderno e o valor recomendado para praticamente todos os formulários.
ISO-8859-1Latin-1, uma codificação legada de 8 bits para línguas da Europa Ocidental. Não consegue representar a maioria dos caracteres não latinos; relevante apenas para sistemas antigos.
UNKNOWNO padrão. Instrui o navegador a usar a mesma codificação do documento que contém o formulário.

Você pode listar mais de uma codificação (por exemplo, accept-charset="UTF-8 ISO-8859-1"); o navegador deve escolher a primeira que ele suporta. Nos navegadores modernos, essa lista é efetivamente ignorada.

Uso moderno e correto

Para praticamente todos os formulários que você escreve hoje, a abordagem correta é não fazer nada de especial: sirva a página como UTF-8 e omita o accept-charset. O formulário então envia UTF-8 automaticamente, que é o que o seu servidor deve 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>

Se preferir ser explícito, escrever accept-charset="UTF-8" é inofensivo e documenta a sua intenção — mas não muda nada, pois UTF-8 já é o comportamento padrão.

Exemplo do atributo HTML accept-charset

O exemplo abaixo define accept-charset="ISO-8859-1", uma codificação legada, para ilustrar a sintaxe do atributo. Observe que os navegadores atuais enviarão este formulário como UTF-8 de qualquer forma — isto é uma demonstração, não uma recomendação.

<!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 formulário relacionados

O atributo accept-charset funciona junto com os outros atributos definidos em um <form>:

  • action — a URL para a qual os dados do formulário são enviados.
  • method — o método HTTP (GET ou POST) usado para enviar o formulário.
  • tag <form> — o elemento contêiner ao qual esses atributos pertencem.

O atributo relacionado enctype (definido no <form>) controla como os dados do formulário são codificados (por exemplo, multipart/form-data para envio de arquivos), o que é uma preocupação separada da codificação de caracteres descrita pelo accept-charset. Consulte o capítulo HTML Forms para uma visão completa, incluindo o enctype.

E se eu realmente precisar suportar um servidor legado sem UTF-8?

Como os navegadores ignoram o accept-charset, você não pode forçar uma página UTF-8 a enviar ISO-8859-1 (ou qualquer outro charset) apenas definindo o atributo — esse caminho é um beco sem saída. Se você está preso a um backend antigo que só entende uma codificação de byte único, a correção correta está no servidor, não no HTML:

  • Converta no servidor. Receba o envio em UTF-8 e transcodifique-o para a codificação legada que sua aplicação precisa (por exemplo, com mb_convert_encoding do PHP, bytes.decode/encode do Python, ou o equivalente da sua plataforma). Esta é a abordagem moderna e recomendada.
  • Migre o backend para UTF-8 sempre que possível — isso elimina permanentemente toda essa classe de problemas.

Tratar o envio como UTF-8 na rede e converter na fronteira é confiável; depender do accept-charset para fazer isso por você não é.

Prática

Prática
O que é o atributo HTML 'accept-charset'?
O que é o atributo HTML 'accept-charset'?
Prática
Em qual elemento você pode usar o atributo accept-charset?
Em qual elemento você pode usar o atributo accept-charset?
Prática
O que acontece em um navegador moderno se você omitir accept-charset em uma página UTF-8?
O que acontece em um navegador moderno se você omitir accept-charset em uma página UTF-8?
Was this page helpful?