浏览器获取css文档编码相对于获取html文档编码要复杂多了,它可以设置编码的地方有ReponseHeader的Content-type字段设置编码,link标签可以设置charset属性也可以设置,还有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;
}