Обнаружить кодировку в PHP без многобайтового расширения?

Есть ли способ определить кодировку строки в PHP без загрузки расширения mbstring? Я знаю, что это можно сделать с помощью mb_detect_encoding(), но есть ли эквивалентная немногобайтовая функция?

Если нет, то что нужно для реализации функции detect_encoding(), которая хотя бы обнаружит UTF-8?


person Jon B    schedule 08.10.2015    source источник
comment
обнаружить кодировку непросто. простой файл ascii, в котором используются только символы 0-127, также является вполне допустимым файлом utf-8, но вы не можете сказать, что он был создан с помощью utf или с ascii старой школы, потому что они неразличимы. вы можете делать такие вещи, как поиск спецификации, но не во всех файлах она есть.   -  person Marc B    schedule 08.10.2015


Ответы (2)


Строки в PHP — это просто последовательности байтов, они не несут никакой информации о кодировке. mb_detect_encoding на самом деле не определяет кодировку строки, он пытается сделать обоснованное предположение, запуская последовательность байтов против ряда функций идентификации, по одной на кодировку (по умолчанию те, которые задаются mb_detect_order), и возвращает первый, в котором последовательность совпадает. Эти функции являются очень простыми и даже не существуют для многих популярных кодировок.

Невозможно, с расширением mbstring или без него, установить кодировку строки — только для того, чтобы может быть исключить некоторые из них, что вы могли бы сделать только в том случае, если строка содержит последовательности байтов, которые были бы недопустимы в этих конкретных кодировках.

Вы никогда не узнаете, является ли "\xC2\xA4" UTF-8 ¤ или ISO-8859-1 ¤, просто взглянув на него, потому что это одни и те же байты.

Для получения дополнительной информации см.: Абсолютный минимум, который каждый разработчик программного обеспечения обязательно должен знать о Unicode и наборах символов

person user3942918    schedule 08.10.2015
comment
спасибо за эту информацию. к последней части моего вопроса с вашей логикой должно быть возможно определить, что строка не является utf8, верно? как бы это выглядело? - person Jon B; 09.10.2015

Всегда есть icv, который обычно включается в PHP с помощью дефолт

<pre>
<?php
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "ISO-8859-1");
var_dump(iconv_get_encoding('all'));
?>
</pre>
person Machavity♦    schedule 08.10.2015
comment
я определенно не знал об этих методах, но мне нужен способ специально проверить строку - person Jon B; 08.10.2015