«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > PHP: переход на мультибайты

PHP: переход на мультибайты

Опубликовано 18 августа 2024 г.
Просматривать:348

PHP: Going multibytes

Многобайтовые символы могут быть непростыми в программировании.

Предупреждение

mbstring не включен по умолчанию. Обязательно прочтите эту часть раньше.

Зачем беспокоиться о многобайтовых строках?

Документ может содержать многобайтовые строки. Хотя в PHP есть множество полезных помощников для строк, эти помощники просто не предназначены для многобайтовых строк.

Скорее всего, это приведет к неприятным ошибкам и другим неожиданным ошибкам, особенно при подсчете символов.

Вот почему вместо этого вы предпочитаете использовать многобайтовые строковые функции в PHP.

Кроме того, в версии 8.4 (следующей версии PHP на момент написания статьи) будут доступны новые функции многобайтовых строк, такие как mb_trim, mb_ltrim и mb_rtrim.

Почему некоторым символам требуется несколько байтов?

В английском языке используется набор символов ASCII, поэтому для таких букв, как r или s, требуется только один байт.

Напротив, в некоторых языках используются символы, которым требуется более одного байта, например символы хань (их может быть до 6 байт!).

Несколько примеров

Подсчет символов

$strings = [
    "?????",
    "チャーミング",
    "González",
];

foreach ($strings as $string) {
    echo 'strlen:' . strlen($string) . ' vs. mb_strlen:' . mb_strlen($string) . PHP_EOL;
}

Найти позицию

echo strpos("チャーミング", "ャ"); // gives 3
echo mb_strpos("チャーミング", "ャ"); // gives 1 because 1st position is 0

Разрезать веревку

echo substr("チャーミング", 3) . PHP_EOL;// ャーミング
echo mb_substr("チャーミング", 3);// ミング

Влияние на производительность

Вы могли прочитать, что функции mbstring могут иметь значительное влияние.

Вы даже можете воспроизвести это с помощью следующего скрипта:

$cnt = 100000;

$strs = [
    'empty' => '',
    'short' => 'zluty kun',
    'short_with_uc' => 'zluty Kun',
    'long' => str_repeat('this is about 10000 chars long string', 270),
    'long_with_uc' => str_repeat('this is about 10000 chars long String', 270),
    'short_utf8' => 'žlutý kůň',
    'short_utf8_with_uc' => 'Žlutý kŮň',
];

foreach ($strs as $k => $str) {
    $a1 = microtime(true);
    for($i=0; $i 



Источник: ошибки PHP

функции mb_* медленнее, но это всегда компромисс, и только контекст должен определять, следует ли вам использовать эти помощники или создавать свои собственные.

Например, если вы замените $cnt = 100000; на $cnt = 100; в приведенном выше сценарии помощники mb_* по-прежнему работают значительно медленнее, но в вашем случае окончательный результат может быть хорошим (например, 0,008 мс против 0,004 мс).

Заворачивать

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/spo0q/php-going-multibytes-3b3b?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3