본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP mb_strlen() — 한글 글자 수 정확히 세기 · strlen과 차이 완전 정리

by 왕진 2026. 7. 10.
반응형

 

 

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학습, 웹개발, 티스토리
반응형

댓글