Eles não precisam , mas é recomendado dar essa informação, já que adivinhar o charset errado pode
- resulta em uma página ilegível (apenas parcial ou completamente em toda a página)
- introduzem possíveis vulnerabilidades no sistema
"Não há nada como texto simples."
Antes do advento do Unicode, os computadores usam várias páginas de código e esquemas de codificação para gravar scripts diferentes. Infelizmente, o ruim é que nenhuma informação de codificação está embutida no arquivo. Essa situação não desaparecerá e conjuntos de caracteres e codificações diferentes continuarão a existir. Um editor de texto terá que abrir o arquivo de texto com a codificação apropriada para obter os pontos de código reais e, em seguida, processá-lo no conjunto de caracteres correto. No entanto, como eles não têm ideia de em que codificação o arquivo está, eles precisam adivinhar ele usando heurística
This algorithm usually involves statistical analysis of byte patterns, like frequency distribution of trigraphs of various languages encoded in each code page that will be detected; such statistical analysis can also be used to perform language detection.
https://en.wikipedia.org/wiki/Charset_detection
O Firefox usa os Detectores do Mozset Charset . A forma como funciona é explicada aqui e você também pode alterar suas preferências heurísticas . O Chrome usou anteriormente o detector de UTI , mas mudou para CED quase 2 anos atrás
Na maioria das vezes eles adivinham as codificações corretamente, mas os algoritmos funcionam melhor para as palavras, de modo que podem falhar em muitos símbolos. As codificações Unicode são geralmente mais fáceis de adivinhar devido à maneira como o UTF-8/16/32 é codificado. Você também pode forçar uma codificação colocando uma BOM no início.
Mas no geral não há como adivinhar todas as codificações e charset de forma confiável, já que o mesmo fluxo de bytes pode ser válido em várias codificações ao mesmo tempo. No final, eles podem cometer erros assim , porque é só adivinhar mesmo assim! É também assim que o famoso Bush escondeu os fatos do erro ocorrido no Bloco de Notas anterior à Vista, quando a API IsTextUnicode
pensa que uma O arquivo de texto ASCII simples é um arquivo UTF-16LE, pois o conteúdo do arquivo também parece OK em UTF-16LE.
A má adivinhação também introduz uma vulnerabilidade ao sistema como a exploração do Google UTF-7 na resposta de David. Como resultado, a codificação deve ser sempre explicitamente declarada.
O bom é que a maioria dos charsets concordam uns com os outros sobre os primeiros 127 pontos de código, então os navegadores podem apenas ler os primeiros bytes do cabeçalho com o charset padrão (ou qualquer apropriado) até ver a opção charset dentro de meta
tag. Se o conjunto de caracteres estiver errado, ele reabrirá o arquivo usando o conjunto de caracteres fornecido no conteúdo do arquivo.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Leia mais: