首页小飞兔下载教程【css编码】浏览器如何获得css文档编码的?
【css编码】浏览器如何获得css文档编码的?

浏览器获取css文档编码相对于获取html文档编码要复杂多了,它可以设置编码的地方有ReponseHeader的Content-type字段设置编码,link标签可以设置charset属性也可以设置,还有css文档也可以设置编码,最后还有一个默认的编码文档。


影响


css文档如果编码识别错误,会有什么影响?对于英文字符都能整常识别的,但是对中文字符会是显示成乱码,这个主要是使用了中文字体的,页面显示的中文字体是英文字体(内容还是中文,我是说显示的字体变化)。


浏览器是获取css文档编码的顺序是怎样的呢?


根据 [1]  CSS 2.1 规范的描述,应按照以下优先级来确定一个外部CSS文件的编码:

1.HTTP 响应头中 "Content-Type" 字段的 "charset" 参数指定的编码。

2.BOM 以及/或者 @charset 定义的编码。

3.<link charset=""> 或其他链接机制提供的元数据(如果有的话)指定的编码。

4.引入该 CSS 文件的 HTML 或另一个 CSS 文件(如果有的话)中已确定的编码。

5.如果以上几步都没能确定编码,则假定其编码为 UTF-8。


发一段从bom中获取编码的方法(C#):


        /// <summary>

        /// 从字节流判断编码(返回null是不能判断出编码)

        /// </summary>

        /// <param name="bt">输入字节流</param>

        /// <returns></returns>

        internal static string GetEncodingByByte(byte[] bt)

        {

            //带BOM的utf-8

            var utf8 = new byte[] { 0xEF, 0xBB, 0xBF };

            if (bt[0] == utf8[0] && bt[1] == utf8[1] && bt[2] == utf8[2])

            {

                return "utf-8";

            }


            //UTF-32-BE

            var utf32Be = new byte[] { 0x00, 0x00, 0xFE, 0xFF };

            if (bt[0] == utf32Be[0] &&

                bt[1] == utf32Be[1] &&

                bt[2] == utf32Be[2] &&

                bt[3] == utf32Be[3])

            {

                return "utf-32";

            }


            //UTF-32-LE

            var utf32Le = new byte[] { 0xFF, 0xFE, 0x00, 0x00 };

            if (bt[0] == utf32Le[0] &&

                bt[1] == utf32Le[1] &&

                bt[2] == utf32Le[2] &&

                bt[3] == utf32Le[3])

            {

                return "utf-32";

            }


            //UTF-32-2143

            var utf322143 = new byte[] { 0x00, 0x00, 0xFF, 0xFE };

            if (bt[0] == utf322143[0] &&

                bt[1] == utf322143[1] &&

                bt[2] == utf322143[2] &&

                bt[3] == utf322143[3])

            {

                return "utf-32";

            }


            //UTF-32-3412

            var utf323412 = new byte[] { 0xFE, 0xFF, 0x00, 0x00 };

            if (bt[0] == utf323412[0] &&

                bt[1] == utf323412[1] &&

                bt[2] == utf323412[2] &&

                bt[3] == utf323412[3])

            {

                return "utf-32";

            }


            //UTF-16-BE

            var utf16Be = new byte[] { 0xFE, 0xFF };

            if (bt[0] == utf16Be[0] &&

                bt[1] == utf16Be[1])

            {

                return "utf-16";

            }


            //UTF-16-LE

            var utf16Le = new byte[] { 0xFF, 0xFE };

            if (bt[0] == utf16Le[0] &&

                bt[1] == utf16Le[1])

            {

                return "utf-16";

            }


            return null;

        }