Menu

strlen() w PHP: długość stringa w bajtach i znakach

strlen($string) zwraca długość stringa w bajtach; mb_strlen($string) zwraca ją w znakach. Dowiedz się, dlaczego polskie litery, japoński tekst i emoji dają różne wyniki, jak sprawdzić pusty string i jak walidować długość danych.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

strlen($string) zwraca długość stringa w bajtach. Aby dostać liczbę znaków, czego potrzebujesz przy tekście japońskim, literach z akcentami, polskich znakach i emoji, użyj mb_strlen($string). Dla zwykłego tekstu angielskiego obie dają tę samą liczbę.

Liczą się spacje, interpunkcja i znaki nowej linii. strlen("a b\n") to 4.

Bajty a znaki w UTF-8

Stringi w PHP to ciągi bajtów, a UTF-8 używa różnej liczby bajtów na znak: 1 dla liter i cyfr ASCII, 2 dla liter takich jak é czy ж (i polskich liter, takich jak ą czy ł), 3 dla kana, popularnych kanji, znaków chińskich i symboli takich jak €, a 4 dla większości emoji i rzadkich kanji takich jak 𠮷. strlen() sumuje bajty; mb_strlen() liczy znaki.

Używaj strlen(), gdy liczą się bajty: kolumna w bazie danych ograniczona w bajtach, rozmiar pliku, protokół binarny. Używaj mb_strlen() dla wszystkiego, co czyta człowiek: licznik znaków, zasada „maks. 20 znaków”, cięcie tekstu przez mb_substr().

Emoji i znaki złożone z kilku punktów kodowych

mb_strlen() liczy punkty kodowe Unicode. Niektóre rzeczy, które czytelnik widzi jako jeden znak, to kilka połączonych punktów kodowych: emoji rodziny, flaga, odcień skóry albo litera ze złożonym akcentem.

Liczenie tego, co czytelnik widzi jako pojedyncze znaki (klastry grafemów), wymaga grapheme_strlen() z rozszerzenia intl:

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

Do licznika znaków w japońskim formularzu zwykle wystarcza mb_strlen(): każde kana i kanji to jeden punkt kodowy.

Szerokość wyświetlania przez mb_strwidth

W terminalu lub w układzie o stałej szerokości japoński znak pełnej szerokości zajmuje dwie kolumny, a katakana połowy szerokości czy litera łacińska jedną. mb_strwidth() zwraca tę szerokość, o którą zwykle chodzi w japońskich zasadach typu „全角は2文字”.

Sprawdzanie, czy string jest pusty

Najczytelniejszy test to ścisłe porównanie z ''. strlen($s) === 0 daje tę samą odpowiedź. empty($s) to nie to samo: zwraca true także dla stringa "0", który w wielu formularzach jest poprawną odpowiedzią.

String ze spacji nie jest pusty. Najpierw przepuść go przez trim(), jeśli same spacje mają liczyć się jako nic.

strlen(null) i wartości niebędące stringami

strlen() oczekuje stringa. Przekazanie null nadal zwraca 0, ale od PHP 8.1 wypisuje komunikat o przestarzałym użyciu:

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

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

Najpierw rzutuj wartość albo podaj wartość domyślną, na przykład strlen($value ?? ''). Liczby całkowite są zamieniane na stringi, więc strlen(12345) to 5. Do liczenia elementów tablicy użyj count().

Walidacja długości danych od użytkownika

Typowa zasada: nazwa użytkownika od 3 do 16 znaków, po przycięciu. Użyj mb_strlen(), żeby japońskie imię było mierzone w znakach, a nie bajtach.

Z strlen() zamiast mb_strlen() やまだたろう liczyłoby się jako 18 i zostałoby odrzucone jako za długie, choć ma sześć znaków.

Najczęściej zadawane pytania

Jak pobrać długość stringa w PHP?

strlen($s) zwraca liczbę bajtów, a mb_strlen($s) liczbę znaków. Dla zwykłego tekstu angielskiego są równe; dla japońskiego, liter z akcentami, polskich znaków czy emoji użyj mb_strlen().

Dlaczego strlen() zwraca złą długość dla tekstu japońskiego?

Nie jest zła, tylko liczy bajty. UTF-8 zapisuje kana i popularne kanji na 3 bajtach każde, więc strlen('日本語') to 9, a mb_strlen('日本語') to 3.

Jak policzyć znaki w stringu z emoji?

mb_strlen() liczy punkty kodowe Unicode, więc proste emoji liczy się jako 1, ale emoji złożone z kilku punktów kodowych (rodzina, flaga, odcień skóry) liczy się jako więcej. grapheme_strlen() z rozszerzenia intl liczy to, co czytelnik widzi jako jeden znak.

Czym różni się strlen od count w PHP?

strlen() mierzy string, a count() liczy elementy tablicy. Przekazanie tablicy do strlen() w PHP 8 rzuca TypeError.

Jak sprawdzić, czy string jest pusty w PHP?

Porównaj go z pustym stringiem: $s === '' albo strlen($s) === 0. Unikaj do tego empty($s), bo traktuje jako pusty także string "0".

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ