Mb convert variables: примеры (PHP)

Полное руководство по mb_convert_variables в PHP
Раздел: Многобайтовые строки
mb_convert_variables(string $to_encoding, array|string $from_encoding, mixed &$var, mixed &...$vars): string|false
Основы функции mb_convert_variables

Функция mb_convert_variables выполняет преобразование кодировки строковых переменных. Она применяется при необходимости изменить кодировку нескольких переменных, включая массивы и объекты, за один вызов.

Аргументы функции
  • to_encoding (обязательный): целевая кодировка для преобразования.
  • from_encoding: исходная кодировка или список кодировок в виде массива. Если используется строка, можно указать несколько кодировок через запятую. Если аргумент опущен, используется внутренняя кодировка.
  • &...$vars: переменные для преобразования. Функция принимает переменное количество аргументов, начиная с третьего. Можно передавать строки, массивы, объекты.

Функция возвращает исходную кодировку первой переменной при успешном преобразовании или false при ошибке.

Базовые примеры использования
Простое преобразование строки
<?php
$str = "Привет";
$from = mb_convert_variables("UTF-8", "Windows-1251", $str);
echo $from; // Возвращает исходную кодировку
?>
Windows-1251
Преобразование нескольких переменных
<?php
$str1 = "Текст1";
$str2 = "Текст2";
$result = mb_convert_variables("UTF-8", "CP1251", $str1, $str2);
var_dump($result);
?>
string(5) "CP1251"
Автоопределение кодировки
<?php
$data = "Пример текста";
mb_convert_variables("UTF-8", "ASCII,UTF-8,Windows-1251", $data);
?>
// Текст будет преобразован, если исходная кодировка указана в списке
Похожие функции в PHP

Преобразует кодировку одной строки. Более простая альтернатива для работы с отдельными строками.

iconv

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

utf8_encode / utf8_decode

Специализированные функции для конвертации между ISO-8859-1 и UTF-8. Ограничены одной парой кодировок.

Критерии выбора

mb_convert_variables предпочтительнее при работе с несколькими переменными разного типа. Для единичных строк чаще используют mb_convert_encoding или iconv.

Типичные ошибки
Неверная исходная кодировка
<?php
$text = "Текст в UTF-8";
$result = mb_convert_variables("UTF-8", "Windows-1251", $text);
// Текст уже в UTF-8, но указана неверная исходная кодировка
?>
// Может привести к некорректному преобразованию
Передача нестроковых значений
<?php
$num = 123;
mb_convert_variables("UTF-8", "ASCII", $num);
// Числа не преобразуются, функция игнорирует нестроковые данные
?>
Использование с объектами
<?php
class Example { public $prop = "Значение"; }
$obj = new Example();
mb_convert_variables("UTF-8", "CP1251", $obj);
// Преобразуются только строковые свойства объекта
?>
Изменения в новых версиях PHP
PHP 8.0

Усилена строгая типизация параметров. Неверные типы аргументов теперь вызывают TypeError.

PHP 7.2

Добавлена поддержка массива кодировок в параметре from_encoding.

Исторические изменения

В ранних версиях функция могла некорректно обрабатывать объекты с приватными свойствами. С PHP 5.6 улучшена обработка сложных структур.

Расширенные примеры
Рекурсивное преобразование многомерного массива
Пример php
<?php
$data = [
    "уровень1" => [
        "поле1" => "Текст1",
        "поле2" => "Текст2"
    ],
    "отдельное" => "Значение"
];

mb_convert_variables("UTF-8", "Windows-1251", $data);
print_r($data);
?>
// Все строковые значения в массиве преобразованы
Работа с объектами разных типов
Пример php
<?php
class User {
    public $name = "Иван";
    private $email = "test@example.com";
}

$obj = new User();
$array = ["комментарий" => "Текст"];
$string = "Строка";

mb_convert_variables("KOI8-R", "UTF-8", $obj, $array, $string);
// Преобразуются все строковые данные в переданных переменных
?>
Обработка смешанных данных
Пример php
<?php
$mixed = [
    42,                    // число
    "текст",              // строка
    null,                 // null
    ["вложенный" => "данные"]  // массив
];

$encoding = mb_convert_variables("UTF-16", "UTF-8", $mixed);
var_dump($encoding);
?>
string(5) "UTF-8"
Особый случай: буферизация вывода
Пример php
<?php
ob_start();
echo "Содержимое в CP1251";
$output = ob_get_contents();
ob_end_clean();

mb_convert_variables("UTF-8", "CP1251", $output);
echo $output;
?>

Пример демонстрирует преобразование захваченного вывода буфера.

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

Mb convert variables в Python

text = "Пример".encode('cp1251')
text_utf8 = text.decode('cp1251').encode('utf-8')

В Python используется цепочка методов encode/decode. Прямого аналога для нескольких переменных нет.

Mb convert variables в Javascript

let decoder = new TextDecoder('windows-1251');
let encoder = new TextEncoder();
let result = encoder.encode(decoder.decode(data));

В JavaScript работа с кодировками осуществляется через TextDecoder/TextEncoder. Преобразование массивов требует отдельной обработки.

Mb convert variables в MySQL

CONVERT(text USING utf8mb4);
-- или
ALTER TABLE table CONVERT TO CHARACTER SET utf8mb4;

MySQL предоставляет CONVERT для отдельных выражений и ALTER TABLE для массового преобразования.

Основные отличия

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

PHP mb_convert_variables function comments

En
Mb convert variables Convert character code in variable(s)