Việc trình duyệt lấy mã hóa tài liệu CSS phức tạp hơn nhiều so với lấy mã hóa tài liệu HTML. Nơi mà trình duyệt có thể đặt mã hóa là trường Kiểu nội dung của ResponseHeader để đặt mã hóa. thuộc tính bộ ký tự và tài liệu CSS cũng có thể được đặt mã hóa và cuối cùng là tài liệu mã hóa mặc định.
Tác động sẽ như thế nào nếu lỗi nhận dạng mã hóa trong tài liệu CSS là chính xác? Các ký tự tiếng Anh có thể được nhận dạng bình thường, nhưng các ký tự tiếng Trung sẽ được hiển thị dưới dạng các ký tự bị cắt xén. Điều này chủ yếu là do sử dụng phông chữ Trung Quốc hiển thị trên trang là phông chữ tiếng Anh (nội dung vẫn bằng tiếng Trung, ý tôi là được hiển thị). thay đổi phông chữ).
Theo đặc tả [1] CSS 2.1, việc mã hóa tệp CSS bên ngoài phải được xác định theo các mức độ ưu tiên sau:
1. Mã hóa được chỉ định bởi tham số "bộ ký tự" của trường "Loại nội dung" trong tiêu đề phản hồi HTTP.
2. BOM và/hoặc mã hóa được xác định bởi @charset.
3.<link charset="">
hoặc siêu dữ liệu khác do cơ chế liên kết cung cấp (nếu có).
4. Giới thiệu mã hóa được xác định trong HTML của tệp CSS này hoặc trong tệp CSS khác (nếu có).
5. Nếu không xác định được mã hóa ở các bước trên thì giả định rằng mã hóa là UTF-8.
Gửi phương thức để nhận mã hóa từ 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; }