ホームページ  >  記事  >  バックエンド開発  >  PHP: マルチバイトへの移行

PHP: マルチバイトへの移行

WBOY
WBOYオリジナル
2024-08-12 08:35:32727ブラウズ

PHP: Going multibytes

プログラミングではマルチバイト文字は扱いにくい場合があります。

警告

mbstring はデフォルトでは有効になっていません。必ずその部分を前に読んでください。

なぜマルチバイト文字列をわざわざ扱うのでしょうか?

ドキュメントにはマルチバイト文字列を含めることができます。 PHP には文字列用の便利なヘルパーがたくさんありますが、これらのヘルパーはマルチバイト文字列用ではありません。

特に文字を数えるときに、厄介なバグやその他の予期しないエラーが発生する可能性があります。

そのため、代わりに PHP でマルチバイト文字列関数を使用することをお勧めします。

さらに、mb_trim、mb_ltrim、mb_rtrim などの新しいマルチバイト文字列関数が 8.4 (この記事の執筆時点では PHP の次のリリース) で利用可能になります。

一部の文字に複数バイトが必要なのはなぜですか?

英語では ASCII 文字セットが使用されるため、r や s のような文字は 1 バイトのみ必要です。

対照的に、一部の言語では、漢文字など、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。