从Javascript动态加载字符集UTF-8和ISO-8859-1



我尝试了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头)指定相同的字符集。

换句话说,停止试图欺骗浏览器/客户端。说实话,这样你就不会再遇到这样的问题了。

最新更新