Mb detect order: примеры (PHP)
mb_detect_order(array|string|null $encoding = null): array|boolФункция 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
)- 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 8.0 функция стала более строгой при передаче некорректных аргументов. Например, передача пустой строки или недопустимого типа может вызвать TypeError.
<?php
// PHP 7.x мог вернуть false, PHP 8.0 может выбросить исключение
mb_detect_order([]); // В PHP 8.0 порядок не изменится, но ошибки не будет.
?>Рекомендуется проверять аргументы перед передачей в функцию и обрабатывать возможные исключения.
<?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
<?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
// Сохраняем текущий порядок
$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
...
)<?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