Menu

PHP strlen(): longitud de un string en bytes y caracteres

strlen($string) devuelve la longitud de una cadena en bytes; mb_strlen($string) la devuelve en caracteres. Aprende por qué el texto japonés y los emojis dan respuestas distintas, cómo comprobar si una cadena está vacía y cómo validar la longitud de la entrada.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

strlen($string) devuelve la longitud de una cadena en bytes. Para caracteres, que es lo que quieres con texto japonés, letras con tilde y emojis, usa mb_strlen($string). En texto en inglés simple las dos dan el mismo número.

Los espacios, la puntuación y los saltos de línea cuentan. strlen("a b\n") es 4.

Bytes vs caracteres en UTF-8

Las cadenas de PHP son secuencias de bytes, y UTF-8 usa un número distinto de bytes por carácter: 1 para letras y dígitos ASCII, 2 para letras como é o ж, 3 para kana, kanji comunes, caracteres chinos y símbolos como €, y 4 para la mayoría de los emojis y kanji raros como 𠮷. strlen() suma los bytes; mb_strlen() cuenta los caracteres.

Usa strlen() cuando importen los bytes: una columna de base de datos limitada en bytes, el tamaño de un archivo, un protocolo binario. Usa mb_strlen() para todo lo que lee una persona: un contador de caracteres, una regla de "máximo 20 caracteres", recortar texto con mb_substr().

Emojis y caracteres formados por varios puntos de código

mb_strlen() cuenta puntos de código Unicode. Algunas cosas que un lector ve como un solo carácter son varios puntos de código unidos: un emoji de familia, una bandera, un tono de piel, o una letra más una tilde combinada.

Contar lo que un lector ve como caracteres individuales (clústeres de grafemas) necesita grapheme_strlen(), de la extensión intl:

echo grapheme_strlen('👨‍👩‍👧');   // 1
echo grapheme_strlen('🇯🇵');     // 1

Para un contador de caracteres en un formulario en japonés, mb_strlen() suele bastar: cada kana y cada kanji es un único punto de código.

Ancho de visualización con mb_strwidth

En una terminal o en un diseño de ancho fijo, un carácter japonés de ancho completo ocupa dos columnas, mientras que un katakana de medio ancho o una letra latina ocupa una. mb_strwidth() devuelve ese ancho, que es a lo que se suelen referir las reglas japonesas de "全角は2文字".

Comprobar si una cadena está vacía

La prueba más clara es una comparación estricta con ''. strlen($s) === 0 da la misma respuesta. empty($s) no es lo mismo: también devuelve true con la cadena "0", que es una respuesta válida en muchos formularios.

Una cadena de espacios no está vacía. Pásala antes por trim() si solo espacios deben contar como nada.

strlen(null) y valores que no son cadenas

strlen() espera una cadena. Pasarle null sigue devolviendo 0, pero desde PHP 8.1 imprime un aviso de obsolescencia:

Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/index.php on line 2

Un array lanza TypeError: strlen(): Argument #1 ($string) must be of type string, array given.

Convierte el valor o dale uno por defecto antes, por ejemplo strlen($value ?? ''). Los enteros se convierten en cadenas, así que strlen(12345) es 5. Para contar los elementos de un array, usa count().

Validar la longitud de la entrada del usuario

Una regla típica: un nombre de usuario de 3 a 16 caracteres, después de recortarlo. Usa mb_strlen() para que un nombre japonés se mida en caracteres, no en bytes.

Con strlen() en lugar de mb_strlen(), やまだたろう contaría como 18 y se rechazaría por demasiado largo, aunque tiene seis caracteres.

Preguntas frecuentes

¿Cómo obtengo la longitud de una cadena en PHP?

strlen($s) devuelve el número de bytes y mb_strlen($s) el número de caracteres. En texto en inglés simple son iguales; para japonés, letras con tilde o emojis usa mb_strlen().

¿Por qué strlen() devuelve una longitud incorrecta con texto japonés?

No es incorrecta, cuenta bytes. UTF-8 guarda los kana y los kanji comunes en 3 bytes cada uno, así que strlen('日本語') es 9 mientras que mb_strlen('日本語') es 3.

¿Cómo cuento los caracteres de una cadena con emojis?

mb_strlen() cuenta puntos de código Unicode, así que un emoji simple cuenta como 1, pero un emoji formado por varios puntos de código (una familia, una bandera, un tono de piel) cuenta como más. grapheme_strlen(), de la extensión intl, cuenta lo que un lector ve como un solo carácter.

¿Cuál es la diferencia entre strlen y count en PHP?

strlen() mide una cadena y count() cuenta los elementos de un array. Pasar un array a strlen() lanza un TypeError en PHP 8.

¿Cómo compruebo si una cadena está vacía en PHP?

Compárala con una cadena vacía: $s === '', o strlen($s) === 0. Evita empty($s) para esto, porque también trata la cadena "0" como vacía.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR