Este mult mai complicat pentru browser să obțină codificarea documentului CSS decât să obțină codificarea documentului HTML Charset și documentul CSS pot fi, de asemenea, setate și, în final, un document de codificare implicit.
Care va fi impactul dacă eroarea de recunoaștere a codificării din documentul CSS este corectă? Caracterele engleze pot fi recunoscute în mod normal, dar caracterele chinezești vor fi afișate ca caractere confuze. Acest lucru se datorează în principal utilizării fonturilor chinezești modificări de font).
Conform specificației [1] CSS 2.1, codificarea unui fișier CSS extern ar trebui determinată în funcție de următoarele priorități:
1. Codificarea specificată de parametrul „charset” din câmpul „Content-Type” din antetul răspunsului HTTP.
2. BOM și/sau codificare definite de @charset.
3.<link charset="">
sau alte metadate furnizate de mecanismul de conectare (dacă există).
4. Introduceți codificarea determinată în HTML-ul acestui fișier CSS sau în alt fișier CSS (dacă există).
5. Dacă codificarea nu poate fi determinată în pașii de mai sus, se presupune că codificarea este UTF-8.
Trimiteți o metodă pentru a obține codificarea din 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; }