我尝试了charset UTF-8来显示ä,它显示了一些方框
我也尝试用字符集ISO-8859-1显示ä,它显示为ä。(正确)
但是当结合上述两个字符集在javascript条件下,它不能正常工作。参考下面的代码,
<html>
<head>
<script type="text/javascript">
var lang = 'German';
function f(){
if(lang != 'SomeOtherLanguage'){
//here code will execute. And page should display square box. Instead of square box, ä is displayed. Which is wrong. I cant able to find reason.
metaTag = '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>';
}
else
metaTag = '<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>';
document.getElementsByTagName('head')[0].innerHTML += metaTag;
}
</script>
</head>
<body onload="f()">
<h1>Latin letter : ä </h1> <br />
</body>
</html>
不能,字符集是由解析器建立的,它需要解析Javascript以生成元DOM。
您仍然可以只使用一个字符集并转换数据
你的企图永远不会成功。
如果HTML的原始字节没有被编码为UTF-8开始,你不能声明UTF-8,在<meta>
标签,或HTTP Content-Type
头。你会对浏览器/客户端撒谎,这就是为什么你会得到不好的结果。
你的代码将"工作"只有当你的<meta>
标签声称ISO-8859-1(没有Content-Type
头覆盖),如果你的HTML实际上是在ISO-8859-1编码。在一些(但不是全部)ISO-8859-X字符集中,包括ISO-8859-1, ä
被编码为字节0xE4
,因此如果字节0x34
存在于HTML的原始数据中,那么您的代码在声明ISO-8859-1时"有效"。
在UTF-8中,ä
被编码为字节0xC3 0xA4
。如果你的HTML包含0xE4
字节,但你声明UTF-8,你会得到不好的结果(0xE4
不是UTF-8的有效字节)。
因此,您的<meta>
标签(和HTTP Content-Type
标头)需要声明一个实际匹配HTML原始字节的真实编码的字符集。
如果您的HTTP服务器正在提供静态HTML文件,则当HTML保存到文件时,该文件将以特定的字符集编码。需要在<meta>
标记中静态地指定相同的字符集(最好也在HTTP Content-Type
标头中指定)。如果你的HTTP服务器是动态生成HTML,它需要在一个特定的字符集编码的HTML传输,所以它需要在生成的<meta>
标签(和Content-Type
头)指定相同的字符集。
换句话说,停止试图欺骗浏览器/客户端。说实话,这样你就不会再遇到这样的问题了。