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

Работа с псевдонимами кодировок: функция mb_encoding_aliases
Раздел: Многобайтовые строки
mb_encoding_aliases(string $encoding): array

Основные сведения о функции mb_encoding_aliases

Функция mb_encoding_aliases возвращает массив, содержащий псевдонимы для указанной кодировки символов. Эта функция является частью модуля mbstring (Multibyte String), который предоставляет поддержку многобайтовых кодировок, таких как UTF-8, EUC-JP и другие.

Назначение и сфера применения

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

Аргументы функции

Функция принимает один обязательный параметр:

  • encoding (string) – название кодировки, для которой необходимо получить список псевдонимов.

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

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

Получение псевдонимов для распространенных кодировок

Пример для кодировки UTF-8:

<?php
$aliases = mb_encoding_aliases('UTF-8');
print_r($aliases);
?>
Array
(
    [0] => utf8
    [1] => utf-8
)
Проверка поддержки кодировки через псевдоним
<?php
$encoding = 'CP936';
if ($aliases = mb_encoding_aliases($encoding)) {
    echo "Кодировка $encoding поддерживается. Псевдонимы: " . implode(', ', $aliases);
} else {
    echo "Кодировка $encoding не найдена.";
}
?>
Кодировка CP936 поддерживается. Псевдонимы: ms936, windows-936
Пример с несуществующей кодировкой
<?php
$result = mb_encoding_aliases('UNKNOWN_ENCODING');
var_dump($result);
?>
bool(false)

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

Прямых аналогов mb_encoding_aliases в стандартной библиотеке PHP нет, но существуют функции для работы с кодировками:

  • mb_list_encodings – возвращает массив всех поддерживаемых кодировок. Используется для получения списка доступных кодировок, но без информации об их псевдонимах.
  • iconv – модуль для конвертации строк между различными кодировками. Предоставляет функцию iconv_get_encoding, но она не возвращает псевдонимы.
  • mb_check_encoding – проверяет, является ли строка корректной для указанной кодировки.

Функция mb_encoding_aliases уникальна именно для получения альтернативных имен кодировок в рамках модуля mbstring.

Типичные ошибки при использовании

Передача неверного типа аргумента
<?php
// Ожидается строка, передается массив
$aliases = mb_encoding_aliases(['UTF-8']);
?>
Warning: mb_encoding_aliases() expects parameter 1 to be string, array given
Использование регистрозависимых названий кодировок

Названия кодировок чувствительны к регистру. Например, 'utf-8' и 'UTF-8' могут восприниматься по-разному:

<?php
$aliases1 = mb_encoding_aliases('utf-8');
$aliases2 = mb_encoding_aliases('UTF-8');
var_dump($aliases1, $aliases2);
?>
bool(false)
array(2) {
  [0]=>
  string(4) "utf8"
  [1]=>
  string(5) "utf-8"
}
Игнорирование возврата false
<?php
$aliases = mb_encoding_aliases('UnknownEncoding');
// Ошибка, если попытаться использовать false как массив
foreach ($aliases as $alias) {
    echo $alias;
}
?>
Warning: foreach() argument must be of type array|object, bool given

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

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

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

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

Построение карты всех кодировок с их псевдонимами
Пример php
<?php
$allEncodings = mb_list_encodings();
$encodingMap = [];

foreach ($allEncodings as $encoding) {
    $aliases = mb_encoding_aliases($encoding);
    if ($aliases !== false) {
        $encodingMap[$encoding] = $aliases;
    }
}

print_r($encodingMap);
?>
Array
(
    [UTF-8] => Array
        (
            [0] => utf8
            [1] => utf-8
        )
    [CP936] => Array
        (
            [0] => ms936
            [1] => windows-936
        )
    ...
)
Нормализация названия кодировки через псевдонимы
Пример php
<?php
function normalizeEncodingName(string $input): string|false {
    $encodings = mb_list_encodings();
    
    // Прямое совпадение
    if (in_array($input, $encodings, true)) {
        return $input;
    }
    
    // Поиск через псевдонимы
    foreach ($encodings as $encoding) {
        $aliases = mb_encoding_aliases($encoding);
        if ($aliases !== false && in_array($input, $aliases, true)) {
            return $encoding;
        }
    }
    
    return false;
}

// Пример использования
$normalized = normalizeEncodingName('utf8');
echo $normalized; // Выведет UTF-8
?>
UTF-8
Валидация пользовательского ввода кодировки
Пример php
<?php
function isEncodingSupported(string $userEncoding): bool {
    // Проверка прямого совпадения
    if (in_array($userEncoding, mb_list_encodings(), true)) {
        return true;
    }
    
    // Проверка среди всех псевдонимов
    foreach (mb_list_encodings() as $encoding) {
        $aliases = mb_encoding_aliases($encoding);
        if ($aliases !== false && in_array($userEncoding, $aliases, true)) {
            return true;
        }
    }
    
    return false;
}

// Примеры
var_dump(isEncodingSupported('UTF-8'));  // true
var_dump(isEncodingSupported('utf8'));   // true
var_dump(isEncodingSupported('Unknown')); // false
?>
bool(true)
bool(true)
bool(false)
Интеграция с функцией mb_convert_encoding
Пример php
<?php
function safeConvertEncoding(string $str, string $toEncoding, string $fromEncoding): string|false {
    // Нормализация названий кодировок
    $normalizedTo = normalizeEncodingName($toEncoding);
    $normalizedFrom = normalizeEncodingName($fromEncoding);
    
    if ($normalizedTo === false || $normalizedFrom === false) {
        return false;
    }
    
    return mb_convert_encoding($str, $normalizedTo, $normalizedFrom);
}

// Пример конвертации с использованием псевдонима
$result = safeConvertEncoding('Пример', 'utf8', 'cp1251');
echo $result;
?>
Пример

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

Mb encoding aliases в Python

В Python для получения информации о кодировках используется модуль codecs. Прямого аналога нет, но можно получить список доступных кодировок:

import codecs
import pprint

# Получение списка всех доступных кодировок
all_encodings = codecs.alias_registry.get_aliases()
# Фильтрация для определенной кодировки (например, utf-8)
aliases = [alias for alias, enc in all_encodings.items() if enc == 'utf_8']
pprint.pprint(aliases)
['utf-8', 'utf8', 'U8', 'UTF', 'utf8', 'cp65001']
JavaScript (Node.js)

В Node.js для работы с кодировками используется модуль buffer и iconv-lite. Прямого аналога функции получения псевдонимов нет. Поддерживаемые кодировки обычно жестко заданы.

Mb encoding aliases в MySQL

В MySQL информация о доступных кодировках хранится в таблице INFORMATION_SCHEMA.CHARACTER_SETS. Запрос для получения данных:

SELECT CHARACTER_SET_NAME, DESCRIPTION 
FROM INFORMATION_SCHEMA.CHARACTER_SETS 
WHERE CHARACTER_SET_NAME LIKE '%utf%';

Это возвращает список кодировок, но не их псевдонимы.

PHP mb_encoding_aliases function comments

En
Mb encoding aliases Get aliases of a known encoding type