Комментарии 16
очередном проекте, понадобилось мне определить кодировку текста, который возвращался в виде XML.
Если кто присылает байтовый набор данных который на самом деле win-1251, а в заголовке XML указана кодировка UTF-8, то я бы ему "мягко" попенял.
Ибо ошибка грубейшая. И чаше всего (на практики было) поправляют эту ошибку..
Почему то (не в обиду, но факт и моя личная статистика) такую ошибку допускают разработчики на PHP.
Типичная ошибка: XML с кодировкой UTF-8 в XML заголовке, без указания codepage в HTTP заголовках c фактическим Win-1251 в HTTP body.
Это я к тому, что определять по косвенным признакам кодировку — закладывать мину замедленного действия.
Почему то такую ошибку допускают разработчики на PHP
Многие все еще не пользуются библиотеками и составляют xml руками, по советам «как сделать xml», что лежат в сети с 2000 года. С того же года и пишут в 1251.
Вы забываете вариант с другими текстовыми файлами прилетевшими не через веб
HTTP body не в той кодировке я привел просто для примера.
Если из непонятного источника загружается в неизвестное кодировке. Т.е. без всякой спецификации и протокола...
К слову, если из файла, то обычно BOM заголовок ставят и его нужно смотреть.
Все офисные пакеты Windows (и C#, например) BOM ставят в начале.
Прекрасно, что за эти годы множество статей на хабре было опубликовано и уже второй пакет на пакаджист выложен.
Но нельзя ли сделать ещё шаг — и попробовать внести предложения по улучшению функции mb_detect_encoding разработчикам языка, чтобы в каком-нибудь PHP 8.0 (9.0 и так далее) это было доступно из коробки.
Или есть какие-то очень значительные препятствия?
KOI8
Он еще где-то живет?
Это кириллица / это не кириллица.
Прямо как с приложением по распознаванию хотдогов.
Совсем скоро закончится поддержка PHP7.1, а Вы всё еще поддерживаете старые версии. Зачем?
Я тоже уже давно перешел на php 7.3, но вы не поверите! Какое существует ОГРОМНОЕ количество «легаси» кода на php 4.0 — 5.6. Часто с ним сталкиваюсь. По этому и понизил версию релиза, хотя это было не просто.
И тесты добавить.
github.com/onnov/detect-encoding
Буду благодарен за помощь.
Я попробовал и столкнулся с проблемой — если я кодирую простую строку как IBM866 или MAC_CYRILLIC — определяет как WINDOWS_1251.
Дело в том, что по умолчанию кодировки IBM866 и MAC-CYRILLIC выключены.
Если вы хотите что бы они определялись их нужно включить:
$detector->enableEncoding(
[
$detector::IBM866,
$detector::MAC_CYRILLIC,
]
);
и нет смысла дублировать фразу:
$text = 'Проверяемый текст Проверяемый текст Проверяемый текст Проверяемый текст Проверяемый текст Проверяемый текст';
т.к. количество символов не изменяется и равно количеству уникальных букв «Проверяемыйтекст».
Определение кодировки текста в PHP вместо mb_detect_encoding