Mb check encoding: примеры (PHP)

Примеры и описание работы mb_check_encoding в PHP
Раздел: Многобайтовые строки
mb_check_encoding(string $string = ?, string $encoding = ?): bool

Функция mb_check_encoding

Назначение

Функция mb_check_encoding проверяет, соответствует ли строка или массив строк указанной кодировке. Её применение актуально при обработке пользовательского ввода, чтении данных из файлов или сетевых источников, где возможны проблемы с кодировкой символов.

Аргументы
  • $string (string|array|null): Проверяемые данные. Может быть строкой, массивом строк или null (в последнем случае функция проверяет, все ли строки в текущем запросе корректны для внутренней кодировки).
  • $encoding (string|null): Название кодировки (например, 'UTF-8', 'Windows-1251'). Если аргумент равен null, используется внутренняя кодировка, установленная функцией mb_internal_encoding().

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

Базовые примеры использования

Проверка строки в UTF-8
echo mb_check_encoding('Привет, мир!', 'UTF-8') ? 'true' : 'false';
true
Проверка строки в неверной кодировке
$str = mb_convert_encoding('Тест', 'Windows-1251', 'UTF-8');
echo mb_check_encoding($str, 'UTF-8') ? 'true' : 'false';
false
Использование внутренней кодировки
mb_internal_encoding('UTF-8');
echo mb_check_encoding('Пример') ? 'true' : 'false';
true
Проверка массива строк
$arr = ['Корректно', 'Valid'];
echo mb_check_encoding($arr, 'UTF-8') ? 'true' : 'false';
true

Похожие функции в PHP

iconv

Функции модуля iconv (iconv, iconv_strlen) также работают с кодировками. iconv может конвертировать строки, а при ошибке вернёт false. Однако mb_check_encoding специализирована именно на проверке без изменения данных.

Функция mb_detect_encoding пытается определить кодировку строки. Её результат не всегда точен, особенно на коротких строках. mb_check_encoding надежнее для валидации, когда ожидаемая кодировка известна.

preg_match с модификатором u

Использование preg_match('/^./u', $string) косвенно проверяет, является ли строка валидной UTF-8. Этот способ менее эффективен и наглядён, чем прямая проверка mb_check_encoding.

Распространённые ошибки

Передача некорректного типа данных
$result = mb_check_encoding(12345, 'UTF-8');
var_dump($result);
bool(false)

Функция ожидает строку или массив. Число не является корректной строкой в любой кодировке.

Проверка без указания кодировки при не установленной внутренней
mb_internal_encoding(null);
$result = mb_check_encoding('Текст');
var_dump($result);
bool(false)

Если внутренняя кодировка не задана, функция может вернуть false даже для корректных строк.

Ошибочное толкование результата для пустой строки
var_dump(mb_check_encoding('', 'UTF-8'));
bool(true)

Пустая строка считается валидной для любой кодировки, что иногда не соответствует ожиданиям разработчика.

Изменения в версиях PHP

В PHP 8.0 поведение функции с аргументом null в качестве строки было изменено. Ранее при mb_check_encoding(null, 'UTF-8') возвращалось false. Теперь это вызывает ошибку уровня E_WARNING, так как ожидается тип string или array.

// PHP 7
var_dump(mb_check_encoding(null, 'UTF-8')); // bool(false)
// PHP 8
var_dump(mb_check_encoding(null, 'UTF-8')); // Warning и false

Расширенные примеры

Фильтрация массива по кодировке
Пример php
$data = ['Валидная', 'Invalid\x80', 'Ещё одна'];
$validData = array_filter($data, function($item) {
    return mb_check_encoding($item, 'UTF-8');
});
print_r($validData);
Array
(
    [0] => Валидная
    [2] => Ещё одна
)
Пакетная проверка файла построчно
Пример php
function isFileValidUtf8($filename) {
    $handle = fopen($filename, 'r');
    while (($line = fgets($handle)) !== false) {
        if (!mb_check_encoding($line, 'UTF-8')) {
            fclose($handle);
            return false;
        }
    }
    fclose($handle);
    return true;
}
// Пример вызова
// var_dump(isFileValidUtf8('data.txt'));
Сравнение поведения с mb_detect_encoding
Пример php
$str = 'Строка';
$isValid = mb_check_encoding($str, 'CP1251'); // false, если строка в UTF-8
$detected = mb_detect_encoding($str, ['CP1251', 'UTF-8'], true); // 'UTF-8'
echo 'Проверка: ' . ($isValid ? 'да' : 'нет') . ', Определение: ' . $detected;
Проверка: нет, Определение: UTF-8
Валидация перед конвертацией
Пример php
$input = 'Данные';
if (mb_check_encoding($input, 'UTF-8')) {
    $converted = mb_convert_encoding($input, 'Windows-1251', 'UTF-8');
    echo 'Конвертировано: ' . bin2hex($converted);
} else {
    echo 'Некорректные данные';
}
Конвертировано: c4e0ede8e5

Аналоги в других языках

Mb check encoding в Python

В Python для проверки кодировки можно использовать метод decode с обработкой исключения UnicodeDecodeError.

try:
    data = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
    data.decode('utf-8')
    print('Корректно')
except UnicodeDecodeError:
    print('Ошибка кодировки')
Корректно

Mb check encoding в Javascript

В JavaScript можно использовать конструктор TextDecoder с опцией fatal: true.

try {
    new TextDecoder('utf-8', { fatal: true }).decode(new Uint8Array([0xD0, 0x9F]));
    console.log('Корректно');
} catch(e) {
    console.log('Ошибка кодировки');
}
Корректно

Mb check encoding в MySQL

В MySQL функция VALIDATE_PASSWORD_STRENGTH не связана с кодировкой. Проверка кодировки обычно выполняется на уровне установки кодировки для столбца или таблицы (например, utf8mb4). Прямого аналога нет.

PHP mb_check_encoding function comments

En
Mb check encoding Check if the string is valid for the specified encoding