Les caractères multi-octets peuvent être délicats à programmer.
mbstring n'est pas activé par défaut. Assurez-vous de lire cette partie avant.
Un document peut contenir des chaînes multi-octets. Bien que PHP dispose de nombreuses aides utiles pour les chaînes, ces aides ne sont tout simplement pas destinées aux chaînes multi-octets.
Cela provoquera probablement de vilains bugs et d'autres erreurs inattendues, en particulier lorsque vous comptez les caractères.
C'est pourquoi vous préférez utiliser les fonctions de chaîne multi-octets en PHP.
En outre, de nouvelles fonctions de chaîne multi-octets, telles que mb_trim, mb_ltrim et mb_rtrim, seront disponibles dans la version 8.4 (la prochaine version de PHP au moment de la rédaction).
L'anglais utilise le jeu de caractères ASCII, donc les lettres comme r ou s ne nécessitent qu'un seul octet.
En revanche, certaines langues utilisent des caractères qui nécessitent plus d'un octet, par exemple les caractères Han (cela peut aller jusqu'à 6 octets !).
$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);// ミング
Vous lirez peut-être que les fonctions mbstring peuvent avoir un impact significatif.
Vous pouvez même le reproduire avec le script suivant :
$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; $iSource : bugs PHP
Les fonctionsmb_* sont plus lentes, mais c'est toujours un compromis, et seul le contexte doit déterminer si vous devez utiliser ces assistants ou créer les vôtres.
Par exemple, si vous remplacez $cnt = 100000; par $cnt = 100 ; dans le script ci-dessus, les assistants mb_* sont encore beaucoup plus lents, mais l'impact final pourrait être correct dans votre cas (par exemple, 0,008 ms contre 0,004 ms).
Conclure
Vous devez prendre en compte les multioctets, surtout dans un contexte multilingue, et PHP a des assistants intégrés pour cela.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3