Rumah > Artikel > pembangunan bahagian belakang > PHP: Berbilang bait
Aksara berbilang bait boleh menjadi rumit dalam pengaturcaraan.
mbstring tidak didayakan secara lalai. Pastikan anda membaca bahagian itu sebelum ini.
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).
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!).
$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);// ミング
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).
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!