반응형
Web Development · PHP 문자열 함수
PHP mb_strlen() — 한글 글자 수를 정확히 세는 함수
strlen과의 차이 · UTF-8 바이트 수 vs 글자 수 · mbstring 확장 완전 정리
시작 오늘 분석할 코드
strlen()은 문자열의 바이트 수를 반환하므로 한글처럼 멀티바이트 문자에서는 글자 수와 다릅니다. mb_strlen()은 인코딩을 인식해 실제 글자(문자) 수를 반환합니다. 한글 처리가 포함된 PHP 프로젝트에서는 strlen 대신 mb_strlen을 사용해야 합니다.
<?php $str = "안녕하세요."; $length = strlen($str); // 바이트 수 반환 $mb_length = mb_strlen($str); // 실제 글자 수 반환 print $length; // 16 (UTF-8에서 한글 1자 = 3바이트, 5자×3 + '.' 1바이트 = 16) print "<br>"; print $mb_length; // 6 (안녕하세요. 총 6글자) ?>
실제 출력 미리보기
strlen("안녕하세요.")
16
바이트 수 (한글 1자 = 3bytes)
mb_strlen("안녕하세요.")
6
실제 글자 수 (안+녕+하+세+요+.)
용어 용어 정리
strlen()문자열의 바이트(byte) 수를 반환. 영문 1자=1byte, 한글 1자=3bytes(UTF-8)
mb_strlen()멀티바이트 인코딩을 인식해 실제 문자(글자) 수를 반환
멀티바이트한 글자가 2바이트 이상인 문자. 한글·중문·일문·이모지 등이 해당
UTF-8가변 길이 인코딩. 영문 1byte, 한글 3bytes, 이모지 4bytes
mbstringPHP 멀티바이트 문자열 처리 확장. mb_ 접두사를 가진 함수군 제공
인코딩문자를 바이트로 표현하는 규칙. UTF-8이 웹 표준. 두 번째 인수로 지정 가능
mb_substr()글자 수 기준으로 부분 문자열 추출. substr()의 멀티바이트 버전
mb_strpos()글자 수 기준으로 문자열 검색. strpos()의 멀티바이트 버전
1 왜 strlen()이 한글에서 틀리는가 — 바이트와 글자의 차이
UTF-8에서 한글 1글자는 3바이트 — strlen은 바이트를 셈
strlen()은 문자열의 바이트 수를 세는 함수입니다. 영문자는 1글자=1바이트이므로 글자 수와 일치하지만, UTF-8에서 한글은 1글자=3바이트입니다. "안녕하세요."(5글자+마침표)를 strlen()으로 세면 5×3+1=16이 됩니다.
$str = "안녕하세요."; // 안 녕 하 세 요 . // [3B][3B][3B][3B][3B][1B] = 16 bytes // 하지만 우리 눈에 보이는 글자는 6개 strlen($str); // 16 ← 바이트 수 mb_strlen($str); // 6 ← 글자 수 // 영문은 동일 strlen("Hello."); // 6 mb_strlen("Hello."); // 6 (영문은 1자=1byte라 같음)
⚠️ 한글이 포함될 수 있는 입력값의 글자 수를 검증할 때 strlen()을 사용하면 실제보다 훨씬 큰 수가 나옵니다. 반드시 mb_strlen()을 사용하세요.
2 두 번째 인수 — 인코딩 명시 방법
인코딩을 지정하지 않으면 php.ini의 mbstring.internal_encoding 사용
mb_strlen()의 두 번째 인수로 인코딩을 지정할 수 있습니다. 지정하지 않으면 php.ini의 mbstring.internal_encoding 설정을 따릅니다. 명시적으로 지정하는 것이 안전합니다.
// 인코딩 지정 없이 (php.ini 설정 따름) mb_strlen($str); // UTF-8 명시 (권장) mb_strlen($str, 'UTF-8'); // EUC-KR 환경 (레거시 시스템) mb_strlen($str, 'EUC-KR'); // EUC-KR에서 한글 1자=2byte → 결과 다를 수 있음
※ 현대 PHP 개발에서 인코딩은 UTF-8이 표준입니다. php.ini에
mbstring.internal_encoding = UTF-8이 설정돼 있으면 인수 생략도 무방하지만, 명시가 더 안전합니다.3 mb_ 함수 패밀리 — strlen만 있는 게 아님
문자열 처리 전반에 mb_ 버전을 사용해야 함
멀티바이트 문제는 strlen에만 해당하는 게 아닙니다. 한글 문자열을 다룰 때는 대부분의 문자열 함수를 mb_ 버전으로 교체해야 합니다.
| 일반 함수 | mb_ 버전 | 역할 |
|---|---|---|
strlen($s) |
mb_strlen($s) |
문자열 길이 (글자 수) |
substr($s, $start, $len) |
mb_substr($s, $start, $len) |
부분 문자열 추출 |
strpos($s, $needle) |
mb_strpos($s, $needle) |
문자열 검색 위치 |
strtolower($s) |
mb_strtolower($s) |
소문자 변환 |
strtoupper($s) |
mb_strtoupper($s) |
대문자 변환 |
str_split($s, $len) |
mb_str_split($s, $len) |
글자 단위 분할 (PHP 7.4+) |
반응형
4 입력 길이 검증 패턴 — 실전 활용
닉네임·댓글 글자 수 제한에 항상 mb_strlen 사용
회원가입 폼의 닉네임, 댓글 길이 제한, 검색어 길이 검증 등에서 mb_strlen()을 사용해야 합니다. strlen()을 쓰면 한글 사용자는 실제보다 훨씬 적은 글자만 입력할 수 있게 됩니다.
$nickname = $_POST['nickname']; // 닉네임 2~10글자 제한 검증 $len = mb_strlen($nickname, 'UTF-8'); if ($len < 2 || $len > 10) { echo "닉네임은 2~10글자여야 합니다. (현재: {$len}글자)"; } else { echo "사용 가능한 닉네임입니다."; }
※ strlen()으로 검증하면 "안녕"(2글자)가 6바이트로 계산돼 2자리 제한을 통과 못 할 수 있습니다. 한글이 있는 곳에서는 항상 mb_strlen()을 사용하세요.
5 mbstring 확장 활성화 확인
mb_ 함수군은 별도 확장이 필요 — 없으면 함수 없음 오류
mb_strlen() 등 mb_ 함수는 PHP의 mbstring 확장이 활성화되어 있어야 사용할 수 있습니다. 대부분의 PHP 환경에서는 기본 활성화되어 있지만, 일부 최소 설치 환경에서는 확인이 필요합니다.
// mbstring 확장 활성화 여부 확인 if (extension_loaded('mbstring')) { echo "mbstring 사용 가능"; } else { echo "mbstring 비활성화 — php.ini에서 extension=mbstring 활성화 필요"; } // php.ini 설정 (활성화 방법) // extension=mbstring // mbstring.internal_encoding = UTF-8
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| strlen으로 한글 길이 검증 | "안녕"이 6바이트라 2자 제한 미통과 | mb_strlen() 사용 |
| substr으로 한글 문자열 자르기 | 한글 중간을 잘라 깨진 문자 출력 | mb_substr() 사용 |
| mbstring 확장 없이 mb_ 함수 호출 | Fatal error: Call to undefined function | php.ini에서 extension=mbstring 활성화 |
| 인코딩 불일치 (EUC-KR 파일에 UTF-8 지정) | 글자 수가 예상과 다르게 나옴 | 파일 인코딩과 mb_ 함수 인코딩 인수를 일치시킴 |
| 이모지를 strlen으로 4바이트 가정 안 함 | 이모지 1개가 4바이트 → 글자 수 불일치 | 이모지 포함 시에도 mb_strlen() 사용 |
핵심 한 줄 요약
strlen vs mb_strlenstrlen=바이트 수 / mb_strlen=실제 글자 수 (한글 포함 시 다름)
UTF-8 한글1글자 = 3바이트 → strlen("안")=3, mb_strlen("안")=1
두 번째 인수'UTF-8' 명시 권장 — 생략 시 php.ini 설정 따름
mb_ 함수 패밀리strlen뿐 아니라 substr, strpos, strtolower 등도 mb_ 버전 사용
주의사항mbstring 확장 활성화 필요 — 없으면 함수 없음 오류
Tags
#PHP #mb_strlen #strlen #한글글자수 #멀티바이트 #UTF-8 #문자열길이 #mbstring #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, mb_strlen, strlen, 한글글자수, 멀티바이트, UTF-8, 문자열길이, mbstring, PHP함수, PHP학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP str_replace() — 문자열 찾아 바꾸기 · 배열 치환 · 대소문자 완전 정리 (0) | 2026.07.10 |
|---|---|
| PHP strip_tags() — HTML 태그 제거 · 허용 태그 지정 · XSS 방어 완전 정리 (0) | 2026.07.10 |
| PHP list() — 배열 분해 할당 · 구조 분해 단축 문법 완전 정리 (1) | 2026.07.10 |
| PHP htmlspecialchars() — XSS 방어 · HTML 특수문자 이스케이프 완전 정리 (0) | 2026.07.10 |
| PHP array_unshift() — 배열 맨 앞에 요소 추가 · 재인덱싱 · push/shift 비교 완전 정리 (0) | 2026.07.10 |
왕진 블로그

댓글