본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP mb_strlen vs strlen — 한글 글자수와 바이트수 차이 완전 정리

by 왕진 2026. 6. 15.
반응형

 

 

Web Development · PHP mb_strlen

PHP mb_strlen vs strlen —
한글의 글자 수와 바이트 수가 다른 이유

"안녕하세요." → strlen 16, mb_strlen 6
시작 오늘 분석할 코드
<?php $str = "안녕하세요."; $length = strlen($str); // 바이트 단위 길이 $mb_length = mb_strlen($str); // 글자 단위 길이 print $length; print "<br>"; print $mb_length; ?>
16
6

같은 문자열을 두 함수가 다르게 센다 — strlen은 16, mb_strlen은 6. 이 차이가 한글 처리의 핵심 함정.

용어 용어 정리
strlen()바이트 단위 길이
mb_strlen()multibyte — 글자 단위 길이
UTF-8한글 1자 = 3바이트, 영문 1자 = 1바이트
EUC-KR한글 1자 = 2바이트 (옛 인코딩)
바이트컴퓨터의 최소 데이터 단위 (8비트)
글자사람이 보는 한 문자
mbstring 확장PHP의 멀티바이트 문자열 모듈
실무한글 닉네임·게시글 길이 검증

1 왜 한글 1자가 3바이트인가?

UTF-8 인코딩은 가변 길이이다. 영문은 1바이트로, 한글·일본어·중국어는 3바이트로 저장된다. 이는 ASCII 호환성과 효율을 동시에 챙기기 위한 설계.

"안녕하세요." → 실제 메모리 (UTF-8) "안" → 0xEC 0x95 0x88 (3바이트) "녕" → 0xEB 0x85 0x95 (3바이트) "하" → 0xED 0x95 0x98 (3바이트) "세" → 0xEC 0x84 0xB8 (3바이트) "요" → 0xEC 0x9A 0x94 (3바이트) "." → 0x2E (1바이트, ASCII) 총: 3+3+3+3+3+1 = 16바이트 글자수: 6개

2 strlen vs mb_strlen 비교
strlen()
바이트 수 카운트
strlen("안녕") = 6
한글 다룰 때 위험
mb_strlen()
글자 수 카운트
mb_strlen("안녕") = 2
한글에 안전

3 활용 — 닉네임 길이 검증
// 사용자가 "안녕" 입력 (2글자) $nick = $_POST['nick']; // 잘못된 검증 — 한글에선 무용지물 if (strlen($nick) > 10) { ... } // "안녕"은 6바이트 → 통과 (잘못) // 올바른 검증 if (mb_strlen($nick, 'UTF-8') > 10) { ... } // 2글자 → 통과 (정상)

 

반응형

 

4 mb_ 함수 가족
함수 설명
mb_strlen($s) 글자 수 — 핵심
mb_substr($s, 시작, 길이) 글자 단위 substring
mb_strpos($s, $needle) 글자 위치 검색
mb_strtoupper($s) 대문자 변환 (다국어 지원)
mb_convert_encoding($s, 'UTF-8', 'EUC-KR') 인코딩 변환
mb_internal_encoding('UTF-8') 기본 인코딩 설정

5 두 번째 매개변수 — 인코딩 명시
mb_strlen($s); // 기본 인코딩 사용 mb_strlen($s, 'UTF-8'); // 명시적 (권장) mb_strlen($s, 'EUC-KR'); // 옛 인코딩이라면

실무에서는 mb_internal_encoding('UTF-8')을 한 번 설정해두고 매개변수를 생략하는 패턴이 흔하다.


6 자주 하는 실수
실수 증상 해결
한글 길이 검증에 strlen 한글이 3배로 셈됨 mb_strlen 사용
한글 substr 글자 깨짐 mb_substr 사용
인코딩 미지정 → 다른 결과 서버 환경에 따라 변동 'UTF-8' 명시 또는 internal_encoding 설정
mbstring 확장 미설치 "undefined function" 오류 php-mbstring 패키지 설치
이모지 글자 수 이상 일부 이모지가 여러 코드포인트 "grapheme_strlen" 또는 별도 라이브러리

7 실무 권장 패턴
// 프로젝트 진입점에 한 번 설정 mb_internal_encoding('UTF-8'); mb_http_output('UTF-8'); // 이후 mb_ 함수는 모두 UTF-8 기준으로 mb_strlen($nick); // 매개변수 생략해도 안전 mb_substr($s, 0, 50);

핵심 한 줄 요약

strlen()바이트 수 — 한글에 위험 (1자=3B)
mb_strlen()글자 수 — 한글 안전
UTF-8 한글1글자 = 3바이트
"안녕하세요."strlen 16, mb_strlen 6
활용닉네임·글자수 제한 검증
mb_ 가족mb_substr·mb_strpos·mb_strtolower 등
실무 설정mb_internal_encoding('UTF-8')
반응형

댓글