Dans la programmation PHP, vous rencontrez souvent certains défis lorsque vous traitez des longueurs de cordes, en particulier pour les jeux de caractères multi-octets (comme le chinois, le japonais, le coréen, etc.). Étant donné que les fonctions Strlen () et substr () sont conçues pour les caractères à un octet par défaut, ils peuvent avoir des problèmes dans des caractères multi-octets. Heureusement, PHP fournit une bibliothèque puissante d' IconV , où iconv_substr () résout bien ce problème. Aujourd'hui, nous explorerons comment utiliser iconv_substr () et strlen () pour contrôler avec précision la longueur des chaînes.
Dans les fonctions traditionnelles substr () et strlen () , si nous avons affaire à des caractères multi-octets (comme chinois), strlen () calculera le nombre d'octets de caractères, plutôt que le nombre de caractères. Cela peut entraîner la longueur de la chaîne calculée comme prévu. Par exemple:
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Bonjour,monde!"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>); </span><span><span class="hljs-comment">// Sortir 18</span></span><span>
</span></span>
À l'heure actuelle, strlen () renvoie le nombre d'octets au lieu de caractères. Les caractères chinois occupent 3 octets chacun, donc cette chaîne a 6 caractères, mais strlen () renvoie accidentellement 18 octets.
iconv_substr () est spécialement utilisé pour traiter les caractères multi -yte. Il peut calculer correctement le nombre de caractères, et non les octets, il peut donc contrôler avec précision la longueur de la chaîne.
Tout d'abord, nous devons utiliser iconv_strlen () pour calculer le nombre de caractères de la chaîne, et non le nombre d'octets. iconv_strlen () renvoie le nombre réel de caractères dans la chaîne, que le jeu de caractères soit un seul octet ou multi-octets.
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Bonjour,monde!"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">iconv_strlen</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>); </span><span><span class="hljs-comment">// Sortir 6</span></span><span>
</span></span>
Ensuite, nous pouvons utiliser iconv_substr () pour intercepter la chaîne. Ses paramètres sont similaires à substr () , mais prennent en charge l'interception correcte des ensembles de caractères multi -yte. En combinant iconv_strlen () et iconv_substr () , nous pouvons contrôler avec précision la longueur de caractère de la chaîne interceptée.
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Bonjour,monde!"</span></span><span>;
</span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-number">3</span></span><span>;
</span><span><span class="hljs-variable">$substring</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_substr</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$substring</span></span><span>; </span><span><span class="hljs-comment">// Sortir "Bonjour,"</span></span><span>
</span></span>
Dans cet exemple, iconv_substr () intercepte du premier caractère de la chaîne et intercepte 3 caractères. Ici, la longueur est un nombre de caractères plutôt qu'un numéro d'octet, qui évite le problème du nombre d'octets inexacts dans substr () .
Parfois, nous devons contrôler dynamiquement la longueur de la chaîne en fonction des différentes conditions, telles que la limitation du nombre de mots affichés. Nous pouvons facilement y parvenir grâce à la combinaison de iconv_substr () et iconv_strlen () .
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">truncate_string</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$string</span></span></span><span>, </span><span><span class="hljs-variable">$max_length</span></span><span>) {
</span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_strlen</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$length</span></span><span> > </span><span><span class="hljs-variable">$max_length</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">iconv_substr</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$max_length</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>) . </span><span><span class="hljs-string">'...'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$string</span></span><span>;
}
}
</span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Bonjour,monde!Ceci est une chaîne de test。"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">truncate_string</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// Sortir "Bonjour,monde!..."</span></span><span>
</span></span>
Dans cet exemple, la fonction truncate_string () intercepte la chaîne en fonction de la longueur maximale donnée et ajoute une ellipsis à la fin.
En utilisant iconv_substr () et iconv_strlen () , nous pouvons résoudre efficacement le problème de contrôle de la longueur de chaîne dans un jeu de caractères multi -yte. Ces fonctions nous permettent de faire fonctionner les chaînes précisément par des caractères plutôt que par des octets, en évitant l'inexactitude de strlen () et substr () sur des caractères multi-lyte. Si votre projet doit faire face aux langues multilingues, en particulier lorsque vous y compris les jeux de caractère chinois, japonais, coréen et d'autres, ces deux fonctions sont des outils très pratiques.