Mb list encodings: примеры (PHP)

Работа с mb_list_encodings: получение списка кодировок
Раздел: Многобайтовые строки
mb_list_encodings: array
Функция mb_list_encodings

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

Функция не принимает аргументов и возвращает индексированный массив строк с именами кодировок.

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

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

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

Получение всего списка поддерживаемых кодировок:

$encodings = mb_list_encodings();
print_r($encodings);
Array
(
    [0] => pass
    [1] => auto
    [2] => wchar
    [3] => byte2be
    [4] => byte2le
    [5] => byte4be
    [6] => byte4le
    [7] => BASE64
    [8] => UUENCODE
    [9] => HTML-ENTITIES
    [10] => Quoted-Printable
    [11] => 7bit
    [12] => 8bit
    [13] => UCS-4
    [14] => UCS-4BE
    [15] => UCS-4LE
    [16] => UCS-2
    [17] => UCS-2BE
    [18] => UCS-2LE
    [19] => UTF-32
    [20] => UTF-32BE
    [21] => UTF-32LE
    [22] => UTF-16
    [23] => UTF-16BE
    [24] => UTF-16LE
    [25] => UTF-8
    [26] => UTF-7
    [27] => UTF7-IMAP
    [28] => ASCII
    [29] => EUC-JP
    [30] => SJIS
    [31] => eucJP-win
    [32] => EUC-JP-2004
    [33] => SJIS-win
    [34] => SJIS-Mobile#DOCOMO
    [35] => SJIS-Mobile#KDDI
    [36] => SJIS-Mobile#SOFTBANK
    [37] => SJIS-mac
    [38] => SJIS-2004
    [39] => UTF-8-Mobile#DOCOMO
    [40] => UTF-8-Mobile#KDDI-A
    [41] => UTF-8-Mobile#KDDI-B
    [42] => UTF-8-Mobile#SOFTBANK
    [43] => CP932
    [44] => CP51932
    [45] => JIS
    [46] => ISO-2022-JP
    [47] => ISO-2022-JP-MS
    [48] => GB18030
    [49] => Windows-1252
    [50] => Windows-1254
    [51] => ISO-8859-1
    [52] => ISO-8859-2
    [53] => ISO-8859-3
    [54] => ISO-8859-4
    [55] => ISO-8859-5
    [56] => ISO-8859-6
    [57] => ISO-8859-7
    [58] => ISO-8859-8
    [59] => ISO-8859-9
    [60] => ISO-8859-10
    [61] => ISO-8859-13
    [62] => ISO-8859-14
    [63] => ISO-8859-15
    [64] => ISO-8859-16
    [65] => EUC-CN
    [66] => CP936
    [67] => HZ
    [68] => EUC-TW
    [69] => BIG-5
    [70] => CP950
    [71] => EUC-KR
    [72] => UHC
    [73] => ISO-2022-KR
    [74] => Windows-1251
    [75] => CP866
    [76] => KOI8-R
    [77] => KOI8-U
    [78] => ArmSCII-8
    [79] => CP850
    [80] => JIS-ms
    [81] => ISO-2022-JP-2004
    [82] => ISO-2022-JP-MOBILE#KDDI
    [83] => CP50220
    [84] => CP50220raw
    [85] => CP50221
    [86] => CP50222
)
Проверка поддержки конкретной кодировки

Использование функции для проверки доступности кодировки:

if (in_array('UTF-8', mb_list_encodings())) {
    echo 'Кодировка UTF-8 поддерживается';
} else {
    echo 'Кодировка UTF-8 не поддерживается';
}
Кодировка UTF-8 поддерживается
Похожие функции в PHP

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

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

$order = mb_detect_order();
print_r($order);
iconv_get_encoding

Функция iconv_get_encoding() возвращает настройки конвертера iconv, включая внутреннюю кодировку, кодировку вывода и длину символов. Не предоставляет списка всех доступных кодировок, но позволяет работать с настройками преобразования.

$iconvSettings = iconv_get_encoding('all');
print_r($iconvSettings);

Функция mb_list_encodings является предпочтительной, когда требуется получить полный перечень поддерживаемых расширением mbstring кодировок. Для задач определения кодировок текста используется mb_detect_encoding с mb_detect_order, а для конвертации - mb_convert_encoding или iconv.

Типичные ошибки
Отсутствие расширения mbstring

Попытка вызова функции без установленного или включенного расширения mbstring приводит к фатальной ошибке.

// Если расширение mbstring не загружено
$encodings = mb_list_encodings();
print_r($encodings);
Fatal error: Uncaught Error: Call to undefined function mb_list_encodings()
Некорректное сравнение имен кодировок

Имена кодировок чувствительны к регистру, что может привести к ложным отрицательным результатам при проверке.

// Неправильно: регистр имеет значение
if (in_array('utf-8', mb_list_encodings())) {
    echo 'Найдено';
} else {
    echo 'Не найдено';
}
Не найдено
// Правильно: использовать реальное имя из списка
if (in_array('UTF-8', mb_list_encodings())) {
    echo 'Найдено';
}
Найдено
Ошибочное предположение о наличии всех кодировок

Список кодировок зависит от версии PHP и собранного расширения mbstring. Не все кодировки могут быть доступны в конкретной среде.

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

Функция mb list encodings была введена в PHP 5.1.2 и с тех пор сохраняет стабильное поведение. В PHP 8.0 и более поздних версиях не было значительных изменений в работе функции. Основные изменения касаются внутренней реализации расширения mbstring и добавления поддержки новых кодировок в отдельных обновлениях.

В PHP 8.1 и 8.2 улучшена совместимость с Unicode и исправлены некоторые проблемы, связанные с обработкой многобайтовых строк, но интерфейс функции остался неизменным. Разработчики могут полагаться на стабильность работы функции при миграции между версиями PHP 7.x и 8.x.

Расширенные примеры
Фильтрация кодировок по критериям

Поиск кодировок, содержащих в названии определенную строку:

Пример php
$search = 'UTF';
$encodings = mb_list_encodings();
$filtered = array_filter($encodings, function($enc) use ($search) {
    return stripos($enc, $search) !== false;
});
print_r(array_values($filtered));
Array
(
    [0] => UTF-32
    [1] => UTF-32BE
    [2] => UTF-32LE
    [3] => UTF-16
    [4] => UTF-16BE
    [5] => UTF-16LE
    [6] => UTF-8
    [7] => UTF-7
    [8] => UTF7-IMAP
    [9] => UTF-8-Mobile#DOCOMO
    [10] => UTF-8-Mobile#KDDI-A
    [11] => UTF-8-Mobile#KDDI-B
    [12] => UTF-8-Mobile#SOFTBANK
)
Создание справочника кодировок с группировкой

Группировка кодировок по категориям для удобства представления:

Пример php
$encodings = mb_list_encodings();
$categories = [
    'Unicode' => [],
    'Japanese' => [],
    'Chinese' => [],
    'Korean' => [],
    'Windows' => [],
    'ISO' => [],
    'Other' => []
];

foreach ($encodings as $enc) {
    if (stripos($enc, 'UTF') === 0 || stripos($enc, 'UCS') === 0) {
        $categories['Unicode'][] = $enc;
    } elseif (stripos($enc, 'SJIS') !== false || stripos($enc, 'EUC-JP') !== false || stripos($enc, 'JIS') !== false) {
        $categories['Japanese'][] = $enc;
    } elseif (stripos($enc, 'GB') !== false || stripos($enc, 'BIG-5') !== false || stripos($enc, 'EUC-CN') !== false) {
        $categories['Chinese'][] = $enc;
    } elseif (stripos($enc, 'CP') === 0 && is_numeric(substr($enc, 2, 3))) {
        $categories['Windows'][] = $enc;
    } elseif (stripos($enc, 'ISO-') === 0) {
        $categories['ISO'][] = $enc;
    } else {
        $categories['Other'][] = $enc;
    }
}

foreach ($categories as $category => $items) {
    echo "$category (" . count($items) . "):\n";
    echo implode(', ', $items) . "\n\n";
}
Валидация пользовательского ввода

Проверка, что пользователь выбрал поддерживаемую кодировку из формы:

Пример php
$userEncoding = $_POST['encoding'] ?? 'UTF-8';
$supportedEncodings = mb_list_encodings();

if (!in_array($userEncoding, $supportedEncodings, true)) {
    die('Выбранная кодировка не поддерживается системой');
}

echo "Кодировка $userEncoding принята для обработки";
Динамическое создание выпадающего списка

Генерация HTML-селекта со всеми доступными кодировками:

Пример php
$encodings = mb_list_encodings();
echo '<select name="encoding">\n';
foreach ($encodings as $enc) {
    $selected = ($enc === 'UTF-8') ? ' selected' : '';
    echo "<option value='$enc'$selected>$enc</option>\n";
}
echo '</select>';
Сравнение списков кодировок между системами

Сохранение и сравнение списков кодировок для диагностики окружения:

Пример php
$currentEncodings = mb_list_encodings();
$savedEncodings = file_get_contents('encodings.json');
$savedEncodings = json_decode($savedEncodings, true);

if ($savedEncodings === null) {
    file_put_contents('encodings.json', json_encode($currentEncodings));
    echo 'Список кодировок сохранен';
} else {
    $diff = array_diff($currentEncodings, $savedEncodings);
    if (!empty($diff)) {
        echo 'Обнаружены новые кодировки: ' . implode(', ', $diff);
    } else {
        echo 'Список кодировок не изменился';
    }
}
Альтернативы в других языках

Mb list encodings в Python

В Python модуль codecs предоставляет функцию codecs.lookup(), которая возвращает информацию о кодировке, но не список всех доступных. Для получения списка используют стандартные кодировки из Python.

import codecs
import encodings

available_encodings = []
for name in dir(encodings):
    if not name.startswith('_'):
        try:
            codecs.lookup(name)
            available_encodings.append(name)
        except LookupError:
            pass

print(available_encodings[:10])
['ascii', 'base64_codec', 'big5', 'big5hkscs', 'bz2_codec', 'cp037', 'cp273', 'cp424', 'cp437', 'cp500']

Mb list encodings в Javascript

В JavaScript браузерного окружения объект TextDecoder и TextEncoder поддерживают ограниченный набор кодировок. Прямого аналога функции получения списка нет, но можно проверить поддержку конкретной кодировки.

try {
    new TextDecoder('utf-8');
    console.log('UTF-8 поддерживается');
} catch (e) {
    console.log('UTF-8 не поддерживается');
}

Mb list encodings в MySQL

В MySQL для просмотра поддерживаемых кодировок используют запрос к INFORMATION_SCHEMA или SHOW CHARACTER SET. Результат включает набор доступных кодировок сервера базы данных.

SHOW CHARACTER SET;

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

PHP mb_list_encodings function comments

En
Mb list encodings Returns an array of all supported encodings