Heim >Backend-Entwicklung >PHP-Tutorial >PHP: Multibytes
Multibyte-Zeichen können beim Programmieren schwierig sein.
mbstring ist standardmäßig nicht aktiviert. Stellen Sie sicher, dass Sie diesen Teil vorher gelesen haben.
Ein Dokument kann Multibyte-Strings enthalten. Während PHP viele nützliche Hilfsprogramme für Strings bietet, sind diese Hilfsprogramme einfach nicht für Multibyte-Strings gedacht.
Es wird wahrscheinlich böse Bugs und andere unerwartete Fehler verursachen, insbesondere wenn Sie Zeichen zählen.
Deshalb sollten Sie stattdessen lieber Multibyte-String-Funktionen in PHP verwenden.
Außerdem werden in 8.4 (der nächsten Version von PHP zum Zeitpunkt des Schreibens) neue Multibyte-String-Funktionen wie mb_trim, mb_ltrim und mb_rtrim verfügbar sein.
Englisch verwendet den ASCII-Zeichensatz, sodass Buchstaben wie r oder s nur ein Byte benötigen.
Im Gegensatz dazu verwenden einige Sprachen Zeichen, die mehr als ein Byte benötigen, zum Beispiel Han-Zeichen (es können bis zu 6 Bytes sein!).
$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);// ミング
Vielleicht lesen Sie, dass MBstring-Funktionen erhebliche Auswirkungen haben können.
Sie können es sogar mit dem folgenden Skript reproduzieren:
$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"; }
Quelle: PHP-Fehler
mb_*-Funktionen sind langsamer, aber es ist immer ein Kompromiss, und nur der Kontext sollte bestimmen, ob Sie diese Helfer verwenden oder Ihre eigenen erstellen sollten.
Wenn Sie beispielsweise $cnt = 100000; durch $cnt = 100; Im obigen Skript sind die mb_*-Helfer immer noch deutlich langsamer, aber die endgültige Auswirkung könnte in Ihrem Fall in Ordnung sein (z. B. 0,008 ms vs. 0,004 ms).
Sie müssen Multibytes berücksichtigen, insbesondere in einem mehrsprachigen Kontext, und PHP verfügt dafür über integrierte Helfer.
Das obige ist der detaillierte Inhalt vonPHP: Multibytes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!