Regrettably, the HTTP spec says that a character-encoding specified in the HTTP header overrides an encoding specified in the body, e.g. through <meta http-equiv="Content-Type" ...> in HTML. This allows proxies to recode for limited browsers (such as on phones) that only support a few encodings, without needing to parse the body. However it also relies on web servers to parse HTML (or other document format) to determine the encoding that should appear in the HTTP header, but they generally don't. Worse, Apache is commonly configured to specify a certain character encoding for all documents because allowing browsers to guess is apparently a security problem. Firefox follows the spec and believes the HTTP header; IE, as usual, ignores the spec and just guesses.