首頁 >後端開發 >php教程 >PHP:走向多位元組

PHP:走向多位元組

WBOY
WBOY原創
2024-08-12 08:35:32748瀏覽

PHP: Going multibytes

多位元組字元在程式設計中可能很棘手。

警告

mbstring 預設情況下不啟用。確保您之前閱讀過該部分。

為什麼要費心多位元組字串呢?

文件可以包含多位元組字串。雖然 PHP 有很多有用的字串幫助器,但這些幫助器根本不適用於多位元組字串。

它可能會導致討厭的錯誤和其他意外錯誤,尤其是在計算字元時。

這就是為什麼您寧願在 PHP 中使用多位元組字串函數。

此外,新的多位元組字串函數,例如 mb_trim、mb_ltrim 和 mb_rtrim 將在 8.4(撰寫本文時的 PHP 的下一個版本)中提供。

為什麼有些字元需要多個位元組?

英文使用 ASCII 字元集,因此像 r 或 s 這樣的字母只需要一個位元組。

相反,有些語言使用需要超過 1 個位元組的字符,例如漢字(最多可達 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 < $cnt; ++$i){
        $res = strtolower($str);
    }
    $t1 = microtime(true) - $a1;
    // echo 'it took ' . round($t1 * 1000, 3) . ' ms for ++$i'."\n";

    $a2 = microtime(true);
    for($i=0; $i < $cnt; $i++){
        $res = mb_strtolower($str);
    }
    $t2 = microtime(true) - $a2;
    // echo 'it took ' . round($t2 * 1000, 3) . ' ms for $i++'."\n";

    echo 'strtolower is '.round($t2/$t1, 2).'x faster than mb_strtolower for ' . $k . "\n\n";
}

來源:PHP 錯誤

mb_* 函數速度較慢,但這始終是一種權衡,只有上下文才能決定您是否應該使用這些幫助器還是建立自己的幫助器。

例如,如果替換$cnt = 100000;通過$cnt = 100;在上面的腳本中, mb_* 助手仍然明顯較慢,但在您的情況下,最終影響可能很好(例如,0.008 毫秒與0.004 毫秒)。

包起來

您必須考慮多字節,尤其是在多語言上下文中,PHP 對此有內建的幫助程式。

以上是PHP:走向多位元組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn