Είναι πολύ πιο περίπλοκο για το πρόγραμμα περιήγησης να αποκτήσει την κωδικοποίηση εγγράφου CSS από το να ρυθμίσει την κωδικοποίηση του εγγράφου HTML Το χαρακτηριστικό συνόλου χαρακτήρων και το έγγραφο CSS μπορεί επίσης να οριστεί κωδικοποίηση και, τέλος, ένα προεπιλεγμένο έγγραφο κωδικοποίησης.
Ποιος θα είναι ο αντίκτυπος εάν το σφάλμα αναγνώρισης κωδικοποίησης στο έγγραφο CSS είναι σωστό; Οι αγγλικοί χαρακτήρες μπορούν να αναγνωριστούν κανονικά, αλλά οι κινεζικοί χαρακτήρες θα εμφανίζονται ως μπερδεμένοι χαρακτήρες. Αυτό οφείλεται κυρίως στη χρήση κινεζικών γραμματοσειρών που εμφανίζονται στη σελίδα αλλαγές γραμματοσειράς).
Σύμφωνα με την προδιαγραφή [1] CSS 2.1, η κωδικοποίηση ενός εξωτερικού αρχείου CSS θα πρέπει να προσδιορίζεται σύμφωνα με τις ακόλουθες προτεραιότητες:
1. Η κωδικοποίηση που καθορίζεται από την παράμετρο "charset" του πεδίου "Content-Type" στην κεφαλίδα απόκρισης HTTP.
2. BOM ή/και κωδικοποίηση που ορίζεται από το @charset.
3.<link charset="">
ή άλλα μεταδεδομένα που παρέχονται από τον μηχανισμό σύνδεσης (εάν υπάρχει).
4. Εισαγάγετε την κωδικοποίηση που καθορίζεται στο HTML αυτού του αρχείου CSS ή σε άλλο αρχείο 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; }