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

Работа с внутренней кодировкой символов в PHP
Раздел: Многобайтовые строки
mb_internal_encoding(?string $encoding = null): string|bool

Функция mb_internal_encoding в PHP

Функция mb_internal_encoding() является частью расширения mbstring и отвечает за установку или получение внутренней кодировки символов для скрипта.

Когда используется

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

Аргументы
  • encoding (необязательный): Строка, определяющая кодировку для установки. Если параметр опущен, функция возвращает текущую внутреннюю кодировку.
  • Возвращает: При успешной установке кодировки – true, при неудаче – false. Если параметр не указан, возвращает имя текущей внутренней кодировки в виде строки или false при ошибке.

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

Получение текущей кодировки
<?php
echo mb_internal_encoding(); // Выведет, например, 'UTF-8'
?>
UTF-8
Установка новой кодировки
<?php
$result = mb_internal_encoding('UTF-8');
var_dump($result); // Успешная установка
echo mb_internal_encoding(); // Проверка
?>
bool(true)
UTF-8
Попытка установить неверную кодировку
<?php
$result = mb_internal_encoding('UNKNOWN-ENCODING');
var_dump($result);
?>
bool(false)

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

  • mb_regex_encoding() – Устанавливает или получает кодировку для регулярных выражений mbstring. Работает отдельно от внутренней кодировки.
  • mb_http_output() – Устанавливает или получает кодировку вывода HTTP. Контролирует преобразование символов перед отправкой в браузер.
  • iconv_set_encoding() – Устанавливает кодировку для расширения iconv. Альтернатива mbstring для преобразования кодировок.
  • ini_set('default_charset', ...) – Установка кодировки по умолчанию через конфигурацию PHP. Влияет на заголовки Content-Type.

Функцию mb_internal_encoding предпочтительнее использовать для согласования кодировок всех операций со строками внутри скрипта при работе с многобайтовыми функциями mbstring. Другие функции предназначены для специфических контекстов (вывод, регулярные выражения).

Типичные ошибки

Установка неподдерживаемой кодировки
<?php
if (!mb_internal_encoding('WINDOWS-1251')) {
    echo 'Не удалось установить кодировку. Возможно, она не поддерживается.';
}
?>
Не удалось установить кодировку. Возможно, она не поддерживается.
Несоответствие кодировок

Ошибки появляются, если внутренняя кодировка не совпадает с реальной кодировкой обрабатываемых строк.

<?php
// Файл сохранен в CP1251, но внутренняя кодировка UTF-8
mb_internal_encoding('UTF-8');
$str = file_get_contents('file_cp1251.txt'); // Строка в CP1251
$length = mb_strlen($str); // Неверная длина символов
?>
// Результат может быть непредсказуемым, например, длина строки окажется больше реального количества символов.

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

  • В PHP 8.0 параметр encoding стал необязательным. Ранее он был обязательным для режима установки.
  • В PHP 7.0 функция перестала быть чувствительной к регистру в названиях кодировок. Имена кодировок рекомендуется указывать в верхнем регистре.
  • Начиная с PHP 5.6, кодировка по умолчанию изменена с ISO-8859-1 на UTF-8 в php.ini (default_charset).

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

Автоматическое определение и установка кодировки
Пример php
<?php
// Попытка установить UTF-8, иначе CP1251
$preferredEncoding = 'UTF-8';
$fallbackEncoding = 'CP1251';

if (!mb_internal_encoding($preferredEncoding)) {
    mb_internal_encoding($fallbackEncoding);
}

echo 'Текущая кодировка: ' . mb_internal_encoding();
?>
Текущая кодировка: UTF-8 (или CP1251, если UTF-8 не поддерживается)
Использование с другими функциями mbstring
Пример php
<?php
mb_internal_encoding('UTF-8');
$str = 'Привет, мир!';
echo 'Длина строки: ' . mb_strlen($str) . ' символов.\n';
echo 'Подстрока: ' . mb_substr($str, 8, 3); // 'мир'
?>
Длина строки: 12 символов.
Подстрока: мир
Временное изменение кодировки для операции
Пример php
<?php
$currentEncoding = mb_internal_encoding(); // Сохраняем текущую

// Обработка строки в другой кодировке
mb_internal_encoding('CP1251');
$strCp1251 = mb_strtoupper('пример');

// Возвращаем исходную кодировку
mb_internal_encoding($currentEncoding);

echo 'Результат в CP1251: ' . $strCp1251 . '\n';
echo 'Возвращенная кодировка: ' . mb_internal_encoding();
?>
Результат в CP1251: ПРИМЕР
Возвращенная кодировка: UTF-8 (или что было изначально)
Проверка поддержки кодировки
Пример php
<?php
$encoding = 'UTF-8';
if (in_array($encoding, mb_list_encodings())) {
    mb_internal_encoding($encoding);
    echo "Кодировка $encoding установлена.";
} else {
    echo "Кодировка $encoding не поддерживается.";
}
?>
Кодировка UTF-8 установлена.

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

Python

Python 3 использует строки Unicode по умолчанию. Понятие "внутренней кодировки" явно не задается. Для работы с байтами используется кодировка/декодировка.

# Кодировка задается при преобразовании строки в байты и обратно.
text = 'Пример'
encoded = text.encode('utf-8')  # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xbc\xd0\xb5\xd1\x80'
decoded = encoded.decode('utf-8')  # 'Пример'
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xbc\xd0\xb5\xd1\x80'
Пример
JavaScript

В JavaScript строки представляют собой последовательности кодовых точек UTF-16. Явной установки внутренней кодировки не существует.

MySQL

Кодировка устанавливается на уровне соединения, базы данных, таблицы или столбца.

-- Установка кодировки соединения
SET NAMES 'utf8mb4';

PHP mb_internal_encoding function comments

En
Mb internal encoding Set/Get internal character encoding