strlen($string) renvoie la longueur d'une chaîne en octets. Pour des caractères, ce qu'il vous faut pour du texte japonais, des lettres accentuées et des emoji, utilisez mb_strlen($string). Pour du texte anglais simple, les deux donnent le même nombre.
Les espaces, la ponctuation et les sauts de ligne comptent tous. strlen("a b\n") vaut 4.
Octets ou caractères en UTF-8
Les chaînes PHP sont des suites d'octets, et l'UTF-8 utilise un nombre d'octets différent selon le caractère : 1 pour les lettres et chiffres ASCII, 2 pour des lettres comme é ou ж, 3 pour les kana, les kanji courants, les caractères chinois et des symboles comme €, et 4 pour la plupart des emoji et les kanji rares comme 𠮷. strlen() additionne les octets ; mb_strlen() compte les caractères.
Utilisez strlen() quand les octets comptent : une colonne de base de données limitée en octets, une taille de fichier, un protocole binaire. Utilisez mb_strlen() pour tout ce qu'une personne lit : un compteur de caractères, une règle « 20 caractères maximum », la découpe de texte avec mb_substr().
Emoji et caractères formés de plusieurs points de code
mb_strlen() compte des points de code Unicode. Certaines choses qu'un lecteur voit comme un seul caractère sont plusieurs points de code assemblés : un emoji famille, un drapeau, une couleur de peau, ou une lettre plus un accent combinant.
Compter ce qu'un lecteur voit comme des caractères uniques (des clusters de graphèmes) demande grapheme_strlen() de l'extension intl :
echo grapheme_strlen('👨👩👧'); // 1
echo grapheme_strlen('🇯🇵'); // 1
Pour un compteur de caractères sur un formulaire japonais, mb_strlen() suffit en général : chaque kana et chaque kanji est un seul point de code.
Largeur d'affichage avec mb_strwidth
Dans un terminal ou une mise en page à largeur fixe, un caractère japonais pleine chasse occupe deux colonnes alors qu'un katakana demi-chasse ou une lettre latine en occupe une. mb_strwidth() renvoie cette largeur, ce que désignent en général les règles japonaises « 全角は2文字 » (un caractère pleine chasse compte double).
Vérifier si une chaîne est vide
Le test le plus clair est une comparaison stricte avec ''. strlen($s) === 0 donne la même réponse. empty($s) n'est pas équivalent : elle renvoie aussi true pour la chaîne "0", une réponse valide dans beaucoup de formulaires.
Une chaîne d'espaces n'est pas vide. Passez-la d'abord dans trim() si des espaces seuls doivent compter comme rien.
strlen(null) et les valeurs qui ne sont pas des chaînes
strlen() attend une chaîne. Passer null renvoie toujours 0, mais depuis PHP 8.1 un avis de dépréciation s'affiche :
Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/index.php on line 2
Un tableau lève TypeError: strlen(): Argument #1 ($string) must be of type string, array given.
Convertissez la valeur ou donnez-lui une valeur par défaut d'abord, par exemple strlen($value ?? ''). Les entiers sont convertis en chaînes, donc strlen(12345) vaut 5. Pour compter les éléments d'un tableau, utilisez count().
Valider la longueur d'une saisie utilisateur
Une règle typique : un nom d'utilisateur de 3 à 16 caractères, après trim. Utilisez mb_strlen() pour qu'un nom japonais soit mesuré en caractères, pas en octets.
Avec strlen() au lieu de mb_strlen(), やまだたろう compterait 18 et serait refusé comme trop long, alors qu'il fait six caractères.
Questions fréquentes
Comment obtenir la longueur d'une chaîne en PHP ?
strlen($s) renvoie le nombre d'octets et mb_strlen($s) le nombre de caractères. Pour du texte anglais simple, ils sont égaux ; pour du japonais, des lettres accentuées ou des emoji, utilisez mb_strlen().
Pourquoi strlen() renvoie-t-elle une mauvaise longueur pour du texte japonais ?
Elle ne se trompe pas, elle compte des octets. L'UTF-8 stocke les kana et les kanji courants sur 3 octets chacun, donc strlen('日本語') vaut 9 alors que mb_strlen('日本語') vaut 3.
Comment compter les caractères d'une chaîne avec des emoji ?
mb_strlen() compte des points de code Unicode, donc un emoji simple compte pour 1, mais un emoji formé de plusieurs points de code (une famille, un drapeau, une couleur de peau) compte pour plus. grapheme_strlen() de l'extension intl compte ce qu'un lecteur voit comme un seul caractère.
Quelle est la différence entre strlen et count en PHP ?
strlen() mesure une chaîne, count() compte les éléments d'un tableau. Passer un tableau à strlen() lève une TypeError en PHP 8.
Comment vérifier si une chaîne est vide en PHP ?
Comparez-la à une chaîne vide : $s === '', ou strlen($s) === 0. Évitez empty($s) pour cela, car elle considère aussi la chaîne "0" comme vide.