Rumah  >  Artikel  >  pembangunan bahagian belakang  >  PHP: Berbilang bait

PHP: Berbilang bait

WBOY
WBOYasal
2024-08-12 08:35:32727semak imbas

PHP: Going multibytes

Aksara berbilang bait boleh menjadi rumit dalam pengaturcaraan.

Amaran

mbstring tidak didayakan secara lalai. Pastikan anda membaca bahagian itu sebelum ini.

Mengapa bersusah payah dengan rentetan multibait?

Sesuatu dokumen boleh mengandungi rentetan berbilangbait. Walaupun PHP mempunyai banyak pembantu berguna untuk rentetan, pembantu ini tidak dimaksudkan untuk rentetan berbilangbait.

Ia berkemungkinan akan menyebabkan pepijat jahat dan ralat lain yang tidak dijangka, terutamanya apabila anda mengira aksara.

Itulah sebabnya anda lebih suka menggunakan Multibait String Functions dalam PHP.

Selain itu, fungsi rentetan berbilangbait baharu, seperti mb_trim, mb_ltrim dan mb_rtrim akan tersedia dalam 8.4 (keluaran PHP seterusnya pada masa penulisan).

Mengapakah sesetengah aksara memerlukan berbilang bait?

Bahasa Inggeris menggunakan set aksara ASCII, jadi huruf seperti r atau s hanya memerlukan satu bait.

Sebaliknya, sesetengah bahasa menggunakan aksara yang memerlukan lebih daripada satu bait, contohnya, aksara Han (boleh sehingga 6 bait!).

Beberapa contoh

Kira aksara

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

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

Cari kedudukan

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

Potong tali

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

Kesan kepada prestasi

Anda mungkin membaca bahawa fungsi mbstring boleh memberi kesan yang ketara.

Anda juga boleh menghasilkan semula dengan skrip berikut:

$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";
}

Sumber: pepijat PHP

fungsi mb_* adalah lebih perlahan, tetapi ia sentiasa bertukar ganti dan hanya konteks yang harus menentukan sama ada anda perlu menggunakan pembantu ini atau membuatnya sendiri.

Sebagai contoh, jika anda menggantikan $cnt = 100000; oleh $cnt = 100; dalam skrip di atas, pembantu mb_* masih jauh lebih perlahan, tetapi kesan akhir mungkin baik dalam kes anda (mis., 0.008 ms lwn. 0.004 ms).

Bungkus

Anda mesti mengambil kira multibait, terutamanya dalam konteks berbilang bahasa dan PHP mempunyai pembantu terbina dalam untuk itu.

Atas ialah kandungan terperinci PHP: Berbilang bait. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn