Mb list encodings: примеры (PHP)
mb_list_encodings: arrayФункция 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 существует несколько функций для работы с кодировками, но прямой альтернативы для получения полного списка нет. Однако некоторые функции предоставляют схожую функциональность:
Функция mb_detect_order() возвращает или устанавливает порядок кодировок для автоматического определения. Она возвращает массив кодировок, используемых в детектировании, но не полный список поддерживаемых. Используется преимущественно для настройки механизма распознавания кодировок.
$order = mb_detect_order();
print_r($order);Функция 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 не загружено
$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. Не все кодировки могут быть доступны в конкретной среде.
Функция mb list encodings была введена в PHP 5.1.2 и с тех пор сохраняет стабильное поведение. В PHP 8.0 и более поздних версиях не было значительных изменений в работе функции. Основные изменения касаются внутренней реализации расширения mbstring и добавления поддержки новых кодировок в отдельных обновлениях.
В PHP 8.1 и 8.2 улучшена совместимость с Unicode и исправлены некоторые проблемы, связанные с обработкой многобайтовых строк, но интерфейс функции остался неизменным. Разработчики могут полагаться на стабильность работы функции при миграции между версиями PHP 7.x и 8.x.
Поиск кодировок, содержащих в названии определенную строку:
$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
)
Группировка кодировок по категориям для удобства представления:
$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";
}Проверка, что пользователь выбрал поддерживаемую кодировку из формы:
$userEncoding = $_POST['encoding'] ?? 'UTF-8';
$supportedEncodings = mb_list_encodings();
if (!in_array($userEncoding, $supportedEncodings, true)) {
die('Выбранная кодировка не поддерживается системой');
}
echo "Кодировка $userEncoding принята для обработки";Генерация HTML-селекта со всеми доступными кодировками:
$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>';Сохранение и сравнение списков кодировок для диагностики окружения:
$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;Главное отличие альтернатив в других языках - отсутствие единой функции, возвращающей массив всех кодировок. Вместо этого используются различные системные способы получения информации о поддержке.