PHP: Multibytes

WBOY
WBOYOriginal
2024-08-12 08:35:32749Durchsuche

PHP: Going multibytes

Multibyte-Zeichen können beim Programmieren schwierig sein.

Warnung

mbstring ist standardmäßig nicht aktiviert. Stellen Sie sicher, dass Sie diesen Teil vorher gelesen haben.

Warum sich mit Multibyte-Strings beschäftigen?

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.

Warum benötigen manche Zeichen mehrere Bytes?

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!).

Ein paar Beispiele

Zeichen zählen

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

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

Position finden

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

Schnur durchschneiden

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

Auswirkungen auf die Leistung

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).

Einpacken

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn