Обнаружение кодировки
Обнаружение кодировки символов , обнаружение набора символов или обнаружение кодовой страницы — это процесс эвристического угадывания кодировки символов серии байтов, представляющих текст. Этот метод признан ненадежным и используется только в том случае, если определенные метаданные , такие как HTTP-запрос, Content-Type: заголовок либо недоступен, либо считается ненадежным.
Этот алгоритм обычно включает статистический анализ шаблонов байтов, например, частотное распределение триграфов различных языков, закодированных в каждой обнаруженной кодовой странице; такой статистический анализ также можно использовать для определения языка . Этот процесс не является надежным, поскольку он зависит от статистических данных.
В общем, неправильное определение кодировки приводит к mojibake .
Одним из немногих случаев, когда определение кодировки работает надежно, является обнаружение UTF-8 . Это связано с большим процентом недопустимых последовательностей байтов в UTF-8, поэтому текст в любой другой кодировке, в которой используются байты с установленным старшим битом, крайне маловероятно пройдет тест на достоверность UTF-8. Однако плохо написанные процедуры определения кодировки не выполняют сначала надежный тест UTF-8 и могут решить, что UTF-8 — это какая-то другая кодировка. Например, часто веб-сайты в кодировке UTF-8, содержащие название немецкого города Мюнхен, отображались как München, поскольку код решал, что это кодировка ISO-8859, прежде чем (или без нее) даже проверить, было ли это кодировкой. UTF-8.
UTF-16 достаточно надежен для обнаружения из-за большого количества символов новой строки (U+000A) и пробелов (U+0020), которые необходимо обнаружить при разделении данных на 16-битные слова, а также большого количества NUL-байтов, причем все по четным значениям. или странные места. проверить общие символы Необходимо , полагаясь на проверку правильности текста. UTF-16 не работает: операционная система Windows ошибочно распознает фразу « Буш скрыл факты » (без новой строки) в ASCII как китайскую UTF- 16LE , поскольку все пары байтов соответствуют назначенным символам Юникода в UTF-16LE.
Обнаружение кодировки особенно ненадежно в Европе, в среде смешанных кодировок ISO-8859. Это тесно связанные восьмибитные кодировки, нижняя половина которых частично совпадает с ASCII , и все расположения байтов допустимы. Не существует технического способа отличить эти кодировки друг от друга, и их распознавание зависит от определения особенностей языка, таких как частота букв или написание.
Из-за ненадежности эвристического обнаружения лучше помечать наборы данных правильной кодировкой. См. Кодировки символов в HTML#Указание кодировки символов документа . Несмотря на то, что UTF-8 и UTF-16 легко обнаружить, некоторые системы требуют кодировки UTF, чтобы явно пометить документ префиксом метки порядка байтов (BOM).
См. также
[ редактировать ]- Международные компоненты для Unicode - библиотека, которая может определять кодировку.
- Идентификация языка
- Обнюхивание контента
- Анализ браузера - аналогичный эвристический метод определения возможностей веб-браузера перед отправкой ему контента.
Ссылки
[ редактировать ]Внешние ссылки
[ редактировать ]- IMultiLanguage2::DetectInputCodepage
- Ссылка на API для определения кодировки ICU
- Справочник по cpdetector обнаружению кодировки
- Детекторы кодировок Mozilla
- Java-порт Mozilla Charset Detectors
- Порт Delphi/Pascal детекторов кодировок Mozilla
- uchardet , C++-форк Mozilla Charset Detectors; включает инструмент командной строки Bash
- Порт C# детекторов кодировок Mozilla
- HEBCI, метод определения набора символов, используемого при отправке форм.
- Распределение частот английских триграфов