strlen($string)은 문자열의 길이를 바이트로 반환합니다. 한글, 일본어, 악센트 문자, 이모지에 필요한 문자 수는 mb_strlen($string)을 쓰세요. 일반 영어 텍스트에서는 둘이 같은 숫자를 줍니다.
공백, 문장 부호, 줄바꿈도 모두 셉니다. strlen("a b\n")은 4입니다.
UTF-8에서 바이트와 문자
PHP 문자열은 바이트의 연속이며, UTF-8은 문자마다 다른 바이트 수를 씁니다. ASCII 문자와 숫자는 1, é나 ж 같은 문자는 2, 가나, 일반 한자, 한글, 중국어 문자, € 같은 기호는 3, 대부분의 이모지와 𠮷 같은 드문 한자는 4바이트입니다. strlen()은 바이트를 더하고 mb_strlen()은 문자를 셉니다.
바이트가 중요할 때 strlen()을 쓰세요. 바이트로 제한된 데이터베이스 컬럼, 파일 크기, 바이너리 프로토콜 등입니다. 사람이 읽는 것에는 mb_strlen()을 쓰세요. 글자 수 카운터, "최대 20자" 규칙, mb_substr()로 텍스트 자르기 등입니다.
이모지와 여러 코드 포인트로 된 문자
mb_strlen()은 유니코드 코드 포인트를 셉니다. 읽는 사람이 한 글자로 보는 것 중 일부는 여러 코드 포인트가 결합된 것입니다. 가족 이모지, 국기, 피부색, 문자와 결합 악센트 등입니다.
읽는 사람이 한 글자로 보는 단위(자소 클러스터)를 세려면 intl 확장의 grapheme_strlen()이 필요합니다.
echo grapheme_strlen('👨👩👧'); // 1
echo grapheme_strlen('🇯🇵'); // 1
일본어 폼의 글자 수 카운터에는 보통 mb_strlen()으로 충분합니다. 모든 가나와 한자는 코드 포인트 하나입니다.
mb_strwidth로 화면 폭 구하기
터미널이나 고정 폭 레이아웃에서 전각 일본어 문자는 두 칸, 반각 가타카나나 라틴 문자는 한 칸을 차지합니다. mb_strwidth()는 그 폭을 반환하며, 일본어에서 "全角は2文字"(전각은 2글자) 규칙이 보통 뜻하는 것이 이것입니다.
문자열이 비어 있는지 확인하기
가장 명확한 확인은 ''와의 엄격한 비교입니다. strlen($s) === 0도 같은 답을 줍니다. empty($s)는 다릅니다. 많은 폼에서 유효한 답인 문자열 "0"에 대해서도 true를 반환합니다.
공백으로만 된 문자열은 비어 있지 않습니다. 공백만 있는 것을 아무것도 없는 것으로 쳐야 한다면 먼저 trim()에 통과시키세요.
strlen(null)과 문자열이 아닌 값
strlen()은 문자열을 기대합니다. null을 넘기면 여전히 0을 반환하지만, PHP 8.1부터는 폐지 예정 알림을 출력합니다.
Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/index.php on line 2
배열은 TypeError: strlen(): Argument #1 ($string) must be of type string, array given을 던집니다.
먼저 값을 형 변환하거나 기본값을 주세요. 예: strlen($value ?? ''). 정수는 문자열로 변환되므로 strlen(12345)는 5입니다. 배열 요소를 세려면 count()를 쓰세요.
사용자 입력 길이 검증하기
대표적인 규칙: trim한 뒤 3자에서 16자 사이의 사용자 이름. 일본어 이름이 바이트가 아니라 문자로 측정되도록 mb_strlen()을 쓰세요.
mb_strlen() 대신 strlen()을 쓰면 やまだたろう는 여섯 글자인데도 18로 세어져 너무 길다고 거부됩니다.
자주 묻는 질문
PHP에서 문자열의 길이를 구하려면 어떻게 하나요?
strlen($s)는 바이트 수를, mb_strlen($s)는 문자 수를 반환합니다. 일반 영어 텍스트에서는 같고, 한글, 일본어, 악센트 문자, 이모지에는 mb_strlen()을 쓰세요.
strlen()이 일본어나 한글 텍스트에서 틀린 길이를 반환하는 이유는 무엇인가요?
틀린 것이 아니라 바이트를 세는 것입니다. UTF-8은 가나와 일반 한자(한글도)를 각각 3바이트에 저장하므로 strlen('日本語')는 9이고 mb_strlen('日本語')는 3입니다.
이모지가 든 문자열의 글자 수를 세려면 어떻게 하나요?
mb_strlen()은 유니코드 코드 포인트를 세므로 단순한 이모지는 1로 세지만, 여러 코드 포인트로 만든 이모지(가족, 국기, 피부색)는 더 많이 셉니다. intl 확장의 grapheme_strlen()은 읽는 사람이 한 글자로 보는 단위를 셉니다.
PHP에서 strlen과 count의 차이는 무엇인가요?
strlen()은 문자열을 재고, count()는 배열의 요소를 셉니다. PHP 8에서 strlen()에 배열을 넘기면 TypeError가 납니다.
PHP에서 문자열이 비어 있는지 확인하려면 어떻게 하나요?
빈 문자열과 비교하세요: $s === '' 또는 strlen($s) === 0. 이 용도로 empty($s)는 피하세요. 문자열 "0"도 비어 있다고 취급하기 때문입니다.