Pull to refresh

Comments 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 и так далее) это было доступно из коробки.


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

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

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

Я тоже уже давно перешел на php 7.3, но вы не поверите! Какое существует ОГРОМНОЕ количество «легаси» кода на php 4.0 — 5.6. Часто с ним сталкиваюсь. По этому и понизил версию релиза, хотя это было не просто.
UFO just landed and posted this here
через PHPStan не прогонял, спасибо за замечание, обязательно поправлю
UFO just landed and posted this here
Я попробовал и столкнулся с проблемой — если я кодирую простую строку как IBM866 или MAC_CYRILLIC — определяет как WINDOWS_1251.


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


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

т.к. количество символов не изменяется и равно количеству уникальных букв «Проверяемыйтекст».
Sign up to leave a comment.

Articles