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".