Как стать автором
Обновить

Комментарии 16

очередном проекте, понадобилось мне определить кодировку текста, который возвращался в виде XML.

Если кто присылает байтовый набор данных который на самом деле win-1251, а в заголовке XML указана кодировка UTF-8, то я бы ему "мягко" попенял.
Ибо ошибка грубейшая. И чаше всего (на практики было) поправляют эту ошибку..


Почему то (не в обиду, но факт и моя личная статистика) такую ошибку допускают разработчики на PHP.
Типичная ошибка: XML с кодировкой UTF-8 в XML заголовке, без указания codepage в HTTP заголовках c фактическим Win-1251 в HTTP body.


Это я к тому, что определять по косвенным признакам кодировку — закладывать мину замедленного действия.

Почему то такую ошибку допускают разработчики на PHP

Многие все еще не пользуются библиотеками и составляют xml руками, по советам «как сделать xml», что лежат в сети с 2000 года. С того же года и пишут в 1251.
Вы забываете вариант с другими текстовыми файлами прилетевшими не через веб. К примеру разные csv выгрузки. Там мета информации о кодировке нет.
Вы забываете вариант с другими текстовыми файлами прилетевшими не через веб

HTTP body не в той кодировке я привел просто для примера.


Если из непонятного источника загружается в неизвестное кодировке. Т.е. без всякой спецификации и протокола...


К слову, если из файла, то обычно BOM заголовок ставят и его нужно смотреть.
Все офисные пакеты Windows (и C#, например) BOM ставят в начале.

Прекрасно, что за эти годы множество статей на хабре было опубликовано и уже второй пакет на пакаджист выложен.


Но нельзя ли сделать ещё шаг — и попробовать внести предложения по улучшению функции mb_detect_encoding разработчикам языка, чтобы в каком-нибудь PHP 8.0 (9.0 и так далее) это было доступно из коробки.


Или есть какие-то очень значительные препятствия?

KOI8

Он еще где-то живет?

Вы не поверите, я тут в суровом легаси избавился от нее год назад только
Правильно ли я понял, что скрипт ищет в тексте знакомые последовательности байтов, и если они похожи на что-то из классической литературы, то говорит, что это 99% кириллица? И если автор текста был безграмотный и писал с ошибками, или новейшие слова которых раньше не было, то скрипт не будет так уверен. Другими словами, скрипт может сказать:
Это кириллица / это не кириллица.

Прямо как с приложением по распознаванию хотдогов.
Нет. Это статистический метод описанный в другой статье Определение кодировки текста в PHP — обзор существующих решений плюс еще один велосипед ищет последовательности. А описанный здесь метод сравнивает коды символов с таблицами символов (кодовыми страницами), считает каких символов больше и выдает результат. т.е. если больше всего символов из кодовой таблицы CP1251 (windows-1251) — значит это кодировка windows-1251. Грамотность и стиль написания текста не имеет значения.
НЛО прилетело и опубликовало эту надпись здесь
Совсем скоро закончится поддержка PHP7.1, а Вы всё еще поддерживаете старые версии. Зачем?

Я тоже уже давно перешел на php 7.3, но вы не поверите! Какое существует ОГРОМНОЕ количество «легаси» кода на php 4.0 — 5.6. Часто с ним сталкиваюсь. По этому и понизил версию релиза, хотя это было не просто.
НЛО прилетело и опубликовало эту надпись здесь
через PHPStan не прогонял, спасибо за замечание, обязательно поправлю
Кстати, можете сами поправить)
И тесты добавить.
github.com/onnov/detect-encoding
Буду благодарен за помощь.
НЛО прилетело и опубликовало эту надпись здесь
Я попробовал и столкнулся с проблемой — если я кодирую простую строку как IBM866 или MAC_CYRILLIC — определяет как WINDOWS_1251.


Дело в том, что по умолчанию кодировки IBM866 и MAC-CYRILLIC выключены.
Если вы хотите что бы они определялись их нужно включить:
$detector->enableEncoding(
    [
        $detector::IBM866,
        $detector::MAC_CYRILLIC,
    ]
);


и нет смысла дублировать фразу:
$text = 'Проверяемый текст Проверяемый текст Проверяемый текст Проверяемый текст Проверяемый текст Проверяемый текст';

т.к. количество символов не изменяется и равно количеству уникальных букв «Проверяемыйтекст».
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории