Mb detect order: примеры (PHP)

Определение порядка кодировок с помощью mb_detect_order
Раздел: Многобайтовые строки
mb_detect_order(array|string|null $encoding = null): array|bool
Описание функции mb_detect_order

Функция mb_detect_order в PHP используется для получения или установки порядка кодировок, в котором функция mb_detect_encoding и другие функции модуля mbstring будут пытаться определить кодировку текста. Установка порядка позволяет управлять приоритетом проверки различных кодировок.

Аргументы функции
  • encoding (необязательный) - может быть задан в виде массива строк или строки, разделенной запятыми. Если параметр передан, функция устанавливает новый порядок кодировок. Если параметр равен null или не указан, функция возвращает текущий порядок.

Функция возвращает массив с текущим порядком кодировок при вызове без аргументов, либо логическое значение true/false при попытке установки нового порядка.

Примеры использования
Получение текущего порядка кодировок
<?php
$order = mb_detect_order();
print_r($order);
?>
Array
(
    [0] => UTF-8
    [1] => UTF-7
    [2] => EUC-JP
    [3] => SJIS
    [4] => eucJP-win
    [5] => SJIS-win
    [6] => JIS
    [7] => ISO-2022-JP
    [8] => ISO-8859-1
    [9] => ISO-8859-2
    [10] => ISO-8859-3
    [11] => ISO-8859-4
    [12] => ISO-8859-5
    [13] => ISO-8859-6
    [14] => ISO-8859-7
    [15] => ISO-8859-8
    [16] => ISO-8859-9
    [17] => ISO-8859-10
    [18] => ISO-8859-13
    [19] => ISO-8859-14
    [20] => ISO-8859-15
    [21] => ISO-8859-16
    [22] => Windows-1251
    [23] => Windows-1252
    [24] => Windows-1254
    [25] => ASCII
)
Установка нового порядка с помощью массива
<?php
mb_detect_order(["UTF-8", "Windows-1251", "ISO-8859-1"]);
print_r(mb_detect_order());
?>
Array
(
    [0] => UTF-8
    [1] => Windows-1251
    [2] => ISO-8859-1
)
Установка нового порядка с помощью строки
<?php
mb_detect_order("UTF-8, Windows-1251, KOI8-R");
print_r(mb_detect_order());
?>
Array
(
    [0] => UTF-8
    [1] => Windows-1251
    [2] => KOI8-R
)
Похожие функции в PHP
  • mb_detect_encoding - определяет кодировку строки, используя текущий порядок mb_detect_order.
  • mb_check_encoding - проверяет, является ли строка корректной для указанной кодировки. Работает с одной конкретной кодировкой, не использует порядок.
  • iconv - функции модуля iconv для конвертации между кодировками. Для определения кодировки обычно используется внешняя библиотека или эвристика.

Функция mb_detect_order предпочтительна для настройки поведения mb_detect_encoding. Если нужна проверка валидности строки в конкретной кодировке, используют mb_check_encoding.

Типичные ошибки
Передача несуществующей кодировки
<?php
$result = mb_detect_order(["UTF-8", "NOT_EXIST"]);
var_dump($result);
?>
bool(false)

Функция возвращает false, так как одна из указанных кодировок неизвестна. Текущий порядок не изменяется.

Ожидание точного определения кодировки
<?php
mb_detect_order(["UTF-8", "Windows-1251"]);
$text = mb_convert_encoding('Пример', 'Windows-1251', 'UTF-8');
$detected = mb_detect_encoding($text);
echo $detected;
?>
UTF-8

Так как текст в Windows-1251 может быть ошибочно определен как UTF-8 из-за бинарной совместимости некоторых символов. Определение кодировки не всегда надежно.

Изменения в последних версиях PHP

В PHP 8.0 функция стала более строгой при передаче некорректных аргументов. Например, передача пустой строки или недопустимого типа может вызвать TypeError.

<?php
// PHP 7.x мог вернуть false, PHP 8.0 может выбросить исключение
mb_detect_order([]); // В PHP 8.0 порядок не изменится, но ошибки не будет.
?>

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

Расширенные примеры
Оптимизация порядка для конкретного региона
Пример php
<?php
// Для работы с русским текстом часто встречаются UTF-8 и Windows-1251
mb_detect_order(["UTF-8", "Windows-1251", "KOI8-R", "ISO-8859-5"]);
$text1 = file_get_contents('russian_utf8.txt');
$text2 = file_get_contents('russian_cp1251.txt');

echo mb_detect_encoding($text1) . "\n";
echo mb_detect_encoding($text2) . "\n";
?>
UTF-8
Windows-1251
Использование с mb_convert_encoding для автоматического исправления
Пример php
<?php
mb_detect_order(["UTF-8", "Windows-1251"]);
function autoConvert($string) {
    $encoding = mb_detect_encoding($string);
    if ($encoding !== 'UTF-8') {
        $string = mb_convert_encoding($string, 'UTF-8', $encoding);
    }
    return $string;
}
$text = "\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"; // UTF-8
echo autoConvert($text);
?>
Привет
Восстановление порядка по умолчанию
Пример php
<?php
// Сохраняем текущий порядок
$originalOrder = mb_detect_order();
// Меняем на кастомный
mb_detect_order(["UTF-8", "ASCII"]);
// Возвращаем обратно
mb_detect_order($originalOrder);
print_r(mb_detect_order());
?>
Array
(
    [0] => UTF-8
    [1] => UTF-7
    [2] => EUC-JP
    [3] => SJIS
    ...
)
Сброс порядка через null
Пример php
<?php
mb_detect_order(["UTF-8", "Windows-1251"]);
// В PHP 8.1+ можно сбросить, передав null
$result = mb_detect_order(null); // Возвращает текущий порядок, не сбрасывает!
// Для сброса нужно явно установить порядок по умолчанию через mb_detect_order(true)
?>

Передача null как аргумента возвращает текущий порядок, но не сбрасывает его. Для сброса на значения по умолчанию можно использовать mb_detect_order(mb_detect_order(true)) или перечислить кодировки вручную.

Альтернативы в других языках

Mb detect order в Python

Используется библиотека chardet или charset_normalizer, которые не требуют явного указания порядка. Они анализируют текст и определяют кодировку с определенной вероятностью.

import chardet
result = chardet.detect(b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82')
print(result)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

Mb detect order в Javascript

В браузере для определения кодировки можно использовать TextDecoder или библиотеки типа jschardet. Node.js использует буферы с указанием кодировки при декодировании.

// Использование TextDecoder в браузере
try {
    const decoder = new TextDecoder('windows-1251');
    const result = decoder.decode(new Uint8Array([207, 240, 232, 226, 229, 242]));
    console.log(result);
} catch(e) {
    console.log('Ошибка кодировки');
}
Привет

Mb detect order в MySQL

Понятие порядка кодировок присутствует на уровне подключения и сравнения. Функции CHARSET() и COLLATION() возвращают информацию о кодировке и сопоставлении для строкового выражения.

SELECT CHARSET('Привет');
utf8mb4

PHP mb_detect_order function comments

En
Mb detect order Set/Get character encoding detection order