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 в противном случае.
Базовые примеры использования
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_strlen) также работают с кодировками. iconv может конвертировать строки, а при ошибке вернёт false. Однако mb_check_encoding специализирована именно на проверке без изменения данных.
Функция mb_detect_encoding пытается определить кодировку строки. Её результат не всегда точен, особенно на коротких строках. mb_check_encoding надежнее для валидации, когда ожидаемая кодировка известна.
Использование 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Расширенные примеры
$data = ['Валидная', 'Invalid\x80', 'Ещё одна'];
$validData = array_filter($data, function($item) {
return mb_check_encoding($item, 'UTF-8');
});
print_r($validData);Array
(
[0] => Валидная
[2] => Ещё одна
)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'));$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
$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). Прямого аналога нет.