マルチバイト文字はプログラミングでは扱いにくい場合があります。
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ソース: PHP のバグ
mb_* 関数は遅いですが、これは常にトレードオフであり、これらのヘルパーを使用するか独自に作成するかはコンテキストによってのみ決定されます。
たとえば、$cnt = 100000; を置き換えるとします。 $cnt = 100により;上記のスクリプトでは、mb_* ヘルパーは依然として大幅に遅いですが、最終的な影響はあなたのケースでは問題ないかもしれません (例: 0.008 ミリ秒対 0.004 ミリ秒)。
まとめ
特に多言語コンテキストではマルチバイトを考慮する必要があり、PHP にはそのためのヘルパーが組み込まれています。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3