Определение кодировки
Обнаружение кодировки
HTML поступает в виде байтов, и слой кодировки отвечает на первый вопрос любого конвейера: какая кодировка и какой текст? Обнаружение следует стандартному подходу — сначала метки порядка байтов, затем декларации внутри содержимого.
Обнаружение из байтов
detect_encoding() анализирует поток байтов и возвращает EncodingDetectionResult, содержащий обнаруженную кодировку, уровень уверенности и декодированный текст. UTF-8 BOM определяется как достоверный, и байты BOM удаляются из декодированного вывода:
from aspose_html.encoding.detection import detect_encoding
result = detect_encoding(b"\xef\xbb\xbf<p>x</p>")
print(result.encoding)
print(result.confidence)
print(result.text)Набор инструментов обнаружения
sniff_bom() проверяет только метки порядка байтов; prescan_meta_charset() применяет стандартный мета-предскан для объявлений набора символов внутри документа; decode_bytes() выполняет декодирование после выбора кодировки. Неподдерживаемые кодировки вызывают типизированный UnsupportedEncodingError.
Канонические имена
Кодировочные метки различаются в разных источниках — latin1, iso-8859-1 и us-ascii все означают windows-1252 согласно стандарту кодирования. get_canonical_name() сопоставляет любую зарегистрированную метку с её каноническим именем.
Советы и лучшие практики
- Доверяйте BOM: если он присутствует, он является окончательным, и детектор сообщает уверенную степень уверенности.
- Нормализуйте метки с помощью
get_canonical_name()перед сравнением кодировок. - Используйте
result.textиз результата обнаружения, а не повторно декодируйте байты вручную.
Распространённые проблемы
| Проблема | Причина | Исправление |
|---|---|---|
| BOM появляется в декодированном тексте | Ручное декодирование вместо detect_encoding() | Обнаружение удаляет байты BOM из result.text |
| Сравнение меток не удалось | Несоответствие псевдонима и канонического имени | Нормализовать с помощью get_canonical_name() |
UnsupportedEncodingError вызван | Входная кодировка вне реестра | Обработать типизированную ошибку; повторно закодировать upstream |
FAQ
Что возвращает обнаружение?
Некий EncodingDetectionResult с encoding, confidence и декодированным text.
Обрабатываются ли устаревшие метки?
Да — таблица алиасов сопоставляет метки, такие как latin1 и us-ascii, их каноническим кодировкам.
Считывает ли обнаружение метатеги?
prescan_meta_charset() реализует стандарты meta-prescan и участвует в обнаружении.
Сводка API Reference
| Класс/Метод | Описание: |
|---|---|
detect_encoding | Обнаружить кодировку и декодировать байты |
EncodingDetectionResult | Объект результата обнаружения |
sniff_bom | Проверка маркера порядка байтов |
prescan_meta_charset | Метапросканирование стандартов |
decode_bytes | Декодировать с выбранной кодировкой |
get_canonical_name | Канонизировать метку кодировки |