文字コードの判別は少々厄介です。UTF-16 などは BOM という目印が先頭についているのでそれで判別できますが、UTF-8 は BOM を付けないのが一般的ですし、他のエンコーディングはそもそも BOM がありません。
なので、複数のエンコーディングを候補とし、先頭から順にある程度の文字数読んでいって、そのエンコーディングとして破綻したところで選択肢から取り除き、最終的に残ったものを消去法で選ぶことになります。しかしこれでも絶対に判別できるわけではなく、複数候補が残った場合にはあらかじめ決めておいた優先順位の高いものを選ぶようにします。
ですから、日本で Shift_JIS EUC-JP ISO-2022-JP が乱立し、各国で独自のエンコーディングを使っていた時には、ウェブブラウザが自動判別を間違えて文字化けすることがしょっちゅうでした。現在は UTF-8 が主流となったことでかなり改善されています。