멀티바이트 문자열

멀티바이트 문자열 (Multibyte String)

UTF-8 같은 멀티바이트 인코딩 문자열을 안전하게 다루기 위한 확장이에요. 한 굴림에 2바이트 이상이 쓰이는 문자 인코딩을 다룰 때, 보통 문자열 함수로는 깨지기 쉬운 문제를 해결해 줍니다.

출처: PHP: Multibyte String - Manual

본문

모든 필요한 문자를 8비트 값 하나로 일대일 표현할 수 있는 언어도 많지만, 글을 쓰는 데 필요한 문자가 너무 많아서 한 바이트로 표현하기 어려운 언어도 있어요. (바이트는 8비트로 구성되죠. 각 비트는 0 또는 1의 두 값만 담을 수 있고, 그 때문에 바이트는 256개(2의 8승)의 고유한 값만 표현할 수 있어요.) 멀티바이트 문자 인코딩 방식은 일반적인 바이트 단위 코딩 시스템에서 256개보다 많은 문자를 표현하기 위해 개발됐어요.

멀티바이트 인코딩으로 된 문자열을 조작(trim, split, splice 등)할 때는 특수한 함수를 써야 해요. 그런 인코딩에서는 두 개 이상의 연속된 바이트가 하나의 문자를 나타낼 수 있으니까요. 그렇지 않고 멀티바이트 인지하지 않는 문자열 함수를 적용하면, 멀티바이트 문자의 시작이나 끝을 제대로 감지하지 못해 결국 원래 의미를 잃은 깨진 문자열로 끝나기 쉬워요.

mbstring은 PHP에서 멀티바이트 인코딩을 다룰 수 있는 멀티바이트 전용 문자열 함수를 제공합니다. 게다가 가능한 인코딩 쌍 사이의 문자 인코딩 변환도 처리해요. mbstring은 UTF-8, UCS-2 같은 유니코드 기반 인코딩과 편의를 위한 많은 단일바이트 인코딩을 다루도록 설계되었어요. (지원되는 문자 인코딩 목록에서 확인할 수 있어요.)

mbstring이 사용하는 유니코드 데이터 테이블은 PHP 8.4.0 기준으로 Unicode 16.0, PHP 8.5.0 기준으로 Unicode 17.0까지 업데이트됐어요.

멀티바이트 문자열 함수

mbstring 함수는 기능별로 자연스럽게 나뉘어요. 자주 쓰는 것부터 정리해 볼게요.

인코딩 변환·검출

함수 설명
mb_convert_encoding 문자열을 한 문자 인코딩에서 다른 인코딩으로 변환
mb_detect_encoding 문자 인코딩 검출
mb_detect_order 문자 인코딩 검출 순서 설정/가져옴
mb_encoding_aliases 알려진 인코딩 타입의 별칭 가져옴
mb_check_encoding 문자열이 지정한 인코딩에 유효한지 확인
mb_list_encodings 지원되는 모든 인코딩의 배열 반환
mb_convert_variables 변수(들)의 문자 코드 변환
mb_internal_encoding 내부 문자 인코딩 설정/가져옴
mb_http_input HTTP 입력 문자 인코딩 검출
mb_http_output HTTP 출력 문자 인코딩 설정/가져옴
mb_language 현재 언어 설정/가져옴
mb_preferred_mime_name MIME charset 문자열 가져옴
mb_substitute_character 대체 문자 설정/가져옴
mb_scrub 잘못된 형태의 바이트 시퀀스를 대체 문자로 바꿈
mb_parse_str GET/POST/COOKIE 데이터 파싱 및 전역 변수 설정

문자열 길이·위치·추출

함수 설명
mb_strlen 문자열 길이 가져옴
mb_strpos 문자열 안에서 문자열이 처음 나타나는 위치 찾기
mb_strrpos 문자열 안에서 문자열이 마지막으로 나타나는 위치 찾기
mb_stripos 대소문자 무시, 문자열이 처음 나타나는 위치 찾기
mb_strripos 대소문자 무시, 문자열이 마지막으로 나타나는 위치 찾기
mb_substr 문자열 일부 가져오기
mb_substr_count 부분 문자열의 등장 횟수 세기
mb_strstr 문자열 안에서 다른 문자열의 첫 등장 찾기
mb_strrchr 문자열 안에서 다른 문자열 안의 문자가 마지막으로 나타나는 위치 찾기
mb_stristr 대소문자 무시, 첫 등장 찾기
mb_strrichr 대소문자 무시, 마지막 등장 찾기
mb_str_split 멀티바이트 문자열이 주어지면 그 문자들의 배열 반환
mb_strcut 문자열 일부 가져오기
mb_str_pad 멀티바이트 문자열을 다른 멀티바이트 문자열로 일정 길이까지 패딩
mb_strimwidth 지정한 너비의 잘린 문자열 가져옴
mb_strwidth 문자열의 너비 반환

문자 단위·대소문자 변환

함수 설명
mb_chr 유니코드 코드 포인트 값으로 문자 반환
mb_ord 문자의 유니코드 코드 포인트 가져옴
mb_strtolower 문자열을 소문자로
mb_strtoupper 문자열을 대문자로
mb_convert_case 문자열에 대소문자 변환(case folding) 수행
mb_ucfirst 문자열의 첫 문자 대문자로
mb_lcfirst 문자열의 첫 문자 소문자로

공백·트리밍

함수 설명
mb_trim 문자열 시작과 끝의 공백(또는 다른 문자) 제거
mb_ltrim 문자열 시작의 공백 제거
mb_rtrim 문자열 끝의 공백 제거

정규식(멀티바이트 지원)

함수 설명
mb_ereg 멀티바이트 지원 정규식 매치
mb_ereg_match 멀티바이트 문자열을 위한 정규식 매치
mb_ereg_replace 멀티바이트 지원 정규식 치환
mb_ereg_replace_callback 콜백을 사용한 멀티바이트 지원 정규식 검색·치환
mb_ereg_search 미리 정의된 멀티바이트 문자열에 대한 멀티바이트 정규식 매치
mb_ereg_search_getpos 다음 정규식 매치의 시작점 반환
mb_ereg_search_getregs 마지막 멀티바이트 정규식 매치의 결과 가져옴
mb_ereg_search_init 멀티바이트 정규식 매치를 위한 문자열·정규식 설정
mb_ereg_search_pos 미리 정의된 문자열에 대한 매치 부분의 위치·길이 반환
mb_ereg_search_regs 멀티바이트 정규식의 매치 부분 반환
mb_ereg_search_setpos 다음 정규식 매치의 시작점 설정
mb_eregi 대소문자 무시 멀티바이트 정규식 매치
mb_eregi_replace 대소문자 무시 멀티바이트 정규식 치환
mb_regex_encoding 멀티바이트 정규식의 문자 인코딩 설정/가져옴
mb_regex_set_options mbregex 함수의 기본 옵션 설정/가져옴
mb_split 정규식을 사용해 멀티바이트 문자열 분할

인코딩 변환 관련 편의

함수 설명
mb_convert_kana 하나의 "kana"를 다른 것으로 변환("zen-kaku"·"han-kaku" 등)
mb_decode_mimeheader MIME 헤더 필드의 문자열 디코드
mb_encode_mimeheader MIME 헤더용 문자열 인코드
mb_decode_numericentity HTML 숫자 문자열 참조를 문자로 디코드
mb_encode_numericentity 문자를 HTML 숫자 문자열 참조로 인코드
mb_send_mail 인코딩된 메일 보내기
mb_get_info mbstring의 내부 설정 가져옴
mb_output_handler 출력 버퍼에서 문자 인코딩을 변환하는 콜백 함수

멀티바이트 문자열을 다룰 때 핵심 규칙은 딱 하나예요. 인코딩을 확실히 알고 그에 맞는 mb_* 함수를 쓴다는 것. ASCII만 다루는 게 아니라면 strlen() 대신 mb_strlen(), substr() 대신 mb_substr()을 쓰는 습관이 깨짐을 예방해 줘요.

더 알아보기