Mb ord: примеры (PHP)
mb_ord(string $string, ?string $encoding = null): int|falseФункция 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 в случае возникновения ошибки, например, если строка пуста.
<?
$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
- 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
Использование 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.
<?
$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.
<?
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)
<?
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)
<?
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