Ви не можете залежати від того, який файл має специфікацію. UTF-8 цього не вимагає. А кодування, не пов’язані з Unicode, навіть не мають специфікації. Однак існують інші способи виявлення кодування.
UTF-32
BOM - 00 00 FE FF (для BE) або FF FE 00 00 (для LE).
Але UTF-32 легко виявити навіть без специфікації. Це тому, що діапазон кодових точок Unicode обмежений U + 10FFFF, і, отже, одиниці UTF-32 завжди мають шаблон 00 {00-10} xx xx (для BE) або xx xx {00-10} 00 (для LE) . Якщо дані мають довжину, кратну 4, і дотримуються одного з цих шаблонів, ви можете сміливо припустити, що це UTF-32. Помилкові спрацьовування майже неможливі через рідкість 00 байт у байтово-орієнтованих кодуваннях.
США-ASCII
Ніякої специфікації, але вона вам не потрібна. ASCII можна легко визначити за відсутністю байтів у діапазоні 80-FF.
UTF-8
BOM - це EF BB BF. Але на це не можна покладатися. Багато файлів UTF-8 не мають специфікації, особливо якщо вони походять із систем, які не є Windows.
Але можна сміливо припустити , що якщо файл Підтверджує як UTF-8, то є UTF-8. Помилкові позитивні результати трапляються рідко.
Зокрема, враховуючи, що дані не є ASCII, коефіцієнт хибнопозитивних даних для 2-байтової послідовності становить лише 3,9% (1920/49152). Для 7-байтової послідовності це менше 1%. Для 12-байтової послідовності це менше 0,1%. Для 24-байтової послідовності це менше 1 на мільйон.
UTF-16
BOM - це FE FF (для BE) або FF FE (для LE). Зверніть увагу, що специфікація UTF-16LE знаходиться на початку специфікації UTF-32LE, тому спочатку перевірте UTF-32.
Якщо у вас трапляється файл, який складається переважно із символів ISO-8859-1, наявність половини байтів у файлі 00 також буде сильним показником UTF-16.
В іншому випадку єдиним надійним способом розпізнавання UTF-16 без специфікації є пошук сурогатних пар (D [8-B] xx D [CF] xx), але символи, що не є BMP, використовуються занадто рідко, щоб зробити цей підхід практичним .
XML
Якщо ваш файл починається з байтів 3C 3F 78 6D 6C (тобто символи ASCII "<? Xml"), тоді шукайте encoding=
декларацію. Якщо є, то скористайтеся цим кодуванням. Якщо немає, то припустимо UTF-8, який є кодуванням XML за замовчуванням.
Якщо вам потрібно підтримати EBCDIC, також шукайте еквівалентну послідовність 4C 6F A7 94 93.
Загалом, якщо у вас є формат файлу, який містить декларацію кодування, тоді шукайте цю декларацію, а не намагайтеся вгадати кодування.
Жоден з перерахованих вище
Існують сотні інших кодувань, які вимагають більше зусиль для виявлення. Я рекомендую спробувати детектор коду Mozilla або його .NET-порт .
Розумний дефолт
Якщо ви виключили кодування UTF і у вас немає декларації кодування або статистичного виявлення, що вказує на інше кодування, припустимо ISO-8859-1 або тісно пов'язану з ним Windows-1252 . (Зверніть увагу, що останній стандарт HTML вимагає, щоб декларація “ISO-8859-1” тлумачилася як Windows-1252.) Будучи кодовою сторінкою Windows за замовчуванням для англійської (та інших популярних мов, таких як іспанська, португальська, німецька та французька), це найчастіше зустрічається кодування, крім UTF-8.