Menu

PHP strlen(): lunghezza di una stringa in byte e caratteri

strlen($string) restituisce la lunghezza di una stringa in byte; mb_strlen($string) la restituisce in caratteri. Scopri perché il testo giapponese e le emoji danno risposte diverse, come verificare una stringa vuota e come validare la lunghezza dell'input.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

strlen($string) restituisce la lunghezza di una stringa in byte. Per i caratteri, che è ciò che vuoi per il testo giapponese, le lettere accentate e le emoji, usa mb_strlen($string). Per un semplice testo inglese le due danno lo stesso numero.

Spazi, punteggiatura e a capo contano tutti. strlen("a b\n") vale 4.

Byte e caratteri in UTF-8

Le stringhe PHP sono sequenze di byte, e UTF-8 usa un numero diverso di byte per carattere: 1 per le lettere e le cifre ASCII, 2 per lettere come é o ж, 3 per kana, kanji comuni, caratteri cinesi e simboli come €, e 4 per la maggior parte delle emoji e i kanji rari come 𠮷. strlen() somma i byte; mb_strlen() conta i caratteri.

Usa strlen() quando contano i byte: una colonna del database limitata in byte, la dimensione di un file, un protocollo binario. Usa mb_strlen() per tutto ciò che legge una persona: un contatore di caratteri, una regola "massimo 20 caratteri", il taglio di un testo con mb_substr().

Emoji e caratteri fatti di più code point

mb_strlen() conta i code point Unicode. Alcune cose che chi legge vede come un solo carattere sono più code point uniti: un'emoji di famiglia, una bandiera, un tono della pelle, oppure una lettera più un accento combinante.

Contare ciò che chi legge vede come caratteri singoli (cluster di grafemi) richiede grapheme_strlen() dell'estensione intl:

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

Per un contatore di caratteri in un form giapponese, mb_strlen() di solito basta: ogni kana e kanji è un singolo code point.

Larghezza di visualizzazione con mb_strwidth

In un terminale o in un layout a larghezza fissa, un carattere giapponese a larghezza piena occupa due colonne mentre un katakana a mezza larghezza o una lettera latina ne occupa una. mb_strwidth() restituisce quella larghezza, che è ciò che intendono di solito le regole giapponesi per cui un carattere a larghezza piena vale due.

Verificare se una stringa è vuota

Il test più chiaro è un confronto stretto con ''. strlen($s) === 0 dà la stessa risposta. empty($s) non è la stessa cosa: restituisce true anche per la stringa "0", che in molti form è una risposta valida.

Una stringa di spazi non è vuota. Passala prima a trim() se i soli spazi devono contare come niente.

strlen(null) e valori che non sono stringhe

strlen() si aspetta una stringa. Passare null restituisce ancora 0, ma da PHP 8.1 stampa un avviso di deprecazione:

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

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

Converti il valore o dagli un default prima, per esempio strlen($value ?? ''). Gli interi vengono convertiti in stringhe, quindi strlen(12345) vale 5. Per contare gli elementi di un array, usa count().

Validare la lunghezza dell'input dell'utente

Una regola tipica: un nome utente da 3 a 16 caratteri, dopo il trim. Usa mb_strlen() così un nome giapponese viene misurato in caratteri, non in byte.

Con strlen() al posto di mb_strlen(), やまだたろう conterebbe 18 e verrebbe rifiutato come troppo lungo, anche se sono sei caratteri.

Domande frequenti

Come ottengo la lunghezza di una stringa in PHP?

strlen($s) restituisce il numero di byte e mb_strlen($s) il numero di caratteri. Per un semplice testo inglese sono uguali; per il giapponese, le lettere accentate o le emoji usa mb_strlen().

Perché strlen() restituisce la lunghezza sbagliata per il testo giapponese?

Non è sbagliata, conta i byte. UTF-8 memorizza i kana e i kanji comuni in 3 byte ciascuno, quindi strlen('日本語') vale 9 mentre mb_strlen('日本語') vale 3.

Come conto i caratteri di una stringa con emoji?

mb_strlen() conta i code point Unicode, quindi un'emoji semplice conta come 1, ma un'emoji costruita con più code point (una famiglia, una bandiera, un tono della pelle) conta di più. grapheme_strlen() dell'estensione intl conta ciò che chi legge vede come un solo carattere.

Qual è la differenza tra strlen e count in PHP?

strlen() misura una stringa, count() conta gli elementi di un array. Passare un array a strlen() lancia un TypeError in PHP 8.

Come verifico se una stringa è vuota in PHP?

Confrontala con una stringa vuota: $s === '', oppure strlen($s) === 0. Evita empty($s) per questo, perché tratta come vuota anche la stringa "0".

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA