دریافت رمزگذاری سند HTML برای مرورگر بسیار پیچیدهتر از به دست آوردن رمزگذاری سند HTML است ویژگی charset، و سند 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; }