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á deaccept-charset.
Sintaxe
<form accept-charset="character_set"></form>Valores comuns de conjunto de caracteres
| Valor | Descrição |
|---|---|
UTF-8 | Codificação Unicode universal. O comportamento padrão de todo navegador moderno e o valor recomendado para praticamente todos os formulários. |
ISO-8859-1 | Latin-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. |
UNKNOWN | O 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 (GETouPOST) 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_encodingdo PHP,bytes.decode/encodedo 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 é.