Mb ord: примеры (PHP)

Получение кода символа Unicode при помощи mb_ord
Раздел: Многобайтовые строки
mb_ord(string $string, ?string $encoding = null): int|false
Описание функции mb_ord

Функция mb_ord в PHP возвращает код символа Unicode для первого символа переданной строки. Это многобайтовый аналог функции ord(), корректно работающий с символами, выходящими за пределы ASCII.

Использование функции актуально при обработке строк в различных кодировках, особенно UTF-8, когда требуется определить числовой код символа, включая эмодзи, иероглифы или символы из расширенных плоскостей Unicode.

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

mb_ord(string $string, ?string $encoding = null): int|false

  • $string (обязательный): Входная строка, код первого символа которой необходимо получить.
  • $encoding (необязательный): Кодировка входной строки. Если параметр равен null или не указан, используется внутренняя кодировка, установленная функцией mb_internal_encoding(). Рекомендуется всегда явно указывать кодировку, например, 'UTF-8'.

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

Краткие примеры использования
Базовый пример с символом ASCII
<?
$code = mb_ord('A', 'UTF-8');
echo $code;
?>
65
Пример с символом кириллицы
<?
$code = mb_ord('Я', 'UTF-8');
echo $code;
?>
1071
Пример с символом эмодзи
<?
$code = mb_ord('????', 'UTF-8');
echo $code; // Десятичный код
printf('U+%04X', $code); // Шестнадцатеричный код
?>
128640
U+1F680
Пример с использованием внутренней кодировки
<?
mb_internal_encoding('UTF-8');
$code = mb_ord('€'); // Кодировка взята из mb_internal_encoding()
echo $code;
?>
8364
Похожие функции в PHP
  • ord(string $string): int — Возвращает ASCII-код первого байта строки. Не работает с многобайтовыми кодировками. Применяется только для символов из диапазона ASCII (0-255).
  • mb_chr(int $codepoint, ?string $encoding = null): string|false — Обратная функция для mb_ord. Преобразует код Unicode в символ. Используется в паре с mb_ord.
  • IntlChar::ord(string $character) — Функция из расширения Intl, также возвращает код Unicode символа. Более строгая: принимает ровно один символ строки. Предпочтительна для сложной работы с Unicode.

Выбор функции зависит от задачи. Для работы с символами Unicode всегда следует использовать mb_ord или IntlChar::ord. Стандартная ord() подходит только для проверки ASCII-символов.

Типичные ошибки
Передача пустой строки

Функция вернет false.

<?
var_dump(mb_ord('', 'UTF-8'));
?>
bool(false)
Указание неверной кодировки

Если символ не может быть представлен в указанной кодировке, результат непредсказуем или функция вернет false.

<?
// Символ кириллицы в кодировке ASCII
$result = mb_ord('Я', 'ASCII');
var_dump($result);
?>
int(208) // Это код только первого байта символа 'Я' в UTF-8, что некорректно для ASCII
Ожидание ASCII-кода для многобайтового символа

Использование ord() вместо mb_ord приводит к получению кода только первого байта.

<?
echo ord('Я') . ' vs ' . mb_ord('Я', 'UTF-8');
?>
208 vs 1071
История изменений
  • PHP 7.2: Функция mb_ord была добавлена в язык вместе с mb_chr.
  • PHP 8.0: Параметр $encoding стал необязательным (nullable). Ранее его нужно было указывать явно.
  • PHP 8.0: При передаче аргументов неверного типа функция теперь выбрасывает исключение TypeError. В более ранних версиях она возвращала false.
Расширенные примеры
Итерация по строке с получением кодов символов
Пример php
<?
$str = 'Привет ????';
$length = mb_strlen($str, 'UTF-8');
for ($i = 0; $i < $length; $i++) {
    $char = mb_substr($str, $i, 1, 'UTF-8');
    $code = mb_ord($char, 'UTF-8');
    echo sprintf('Символ: %s | Код: %d (0x%04X)', $char, $code, $code) . PHP_EOL;
}
?>
Символ: П | Код: 1055 (0x041F)
Символ: р | Код: 1088 (0x0440)
Символ: и | Код: 1080 (0x0438)
Символ: в | Код: 1074 (0x0432)
Символ: е | Код: 1077 (0x0435)
Символ: т | Код: 1090 (0x0442)
Символ:   | Код: 32 (0x0020)
Символ: ???? | Код: 128024 (0x1F418)
Проверка, является ли символ эмодзи

Многие эмодзи находятся в определенных диапазонах Unicode.

Пример php
<?
function isEmoji($char) {
    $code = mb_ord($char, 'UTF-8');
    return ($code >= 0x1F600 && $code <= 0x1F64F) // Эмодзи эмоций
        || ($code >= 0x1F300 && $code <= 0x1F5FF) // Разные символы и пиктограммы
        || ($code >= 0x1F680 && $code <= 0x1F6FF); // Транспорт и карты
}

var_dump(isEmoji('????'));
var_dump(isEmoji('A'));
?>
bool(true)
bool(false)
Сравнение регистронезависимое для Unicode
Пример php
<?
function mb_ord_casefold($char, $encoding) {
    // Приведение символа к нижнему регистру перед получением кода
    $lowerChar = mb_strtolower($char, $encoding);
    return mb_ord($lowerChar, $encoding);
}

$code1 = mb_ord_casefold('Я', 'UTF-8');
$code2 = mb_ord_casefold('я', 'UTF-8');
var_dump($code1 === $code2);
?>
bool(true)
Определение направления символа (LTR/RTL)
Пример php
<?
function getCharDirection($char) {
    $code = mb_ord($char, 'UTF-8');
    // Простейшая проверка на базовые диапазоны
    if (($code >= 0x0590 && $code <= 0x05FF) || // Иврит
        ($code >= 0x0600 && $code <= 0x06FF) || // Арабский
        ($code >= 0x0700 && $code <= 0x074F)) {
        return 'RTL';
    }
    // Много других диапазонов...
    return 'LTR';
}

echo getCharDirection('א') . PHP_EOL;
echo getCharDirection('A');
?>
RTL
LTR
Альтернативы в других языках

Mb ord в Python

Функция ord() работает аналогично, но всегда для Unicode. Не требует указания кодировки.

print(ord('Я'))
print(ord('????'))
1071
128640

Mb ord в Javascript

Метод String.prototype.codePointAt(). Индекс символа в строке передается аргументом.

console.log('Я'.codePointAt(0));
console.log('????'.codePointAt(0));
1071
128640

Mb ord в MySQL

Функция ORD() возвращает код только первого символа, но для многобайтовых символов результат может отличаться (возвращает код первого байта). Для полной поддержки Unicode используют HEX() или UNICODE() (последняя для UCS-2).

SELECT ORD('Я'), HEX('Я'), UNICODE('Я');
208 (только первый байт в UTF-8)
D0AF
1071

PHP mb_ord function comments

En
Mb ord Get code point of character