멀티바이트 문자열
멀티바이트 문자열 (Multibyte String)
UTF-8 같은 멀티바이트 인코딩 문자열을 안전하게 다루기 위한 확장이에요. 한 굴림에 2바이트 이상이 쓰이는 문자 인코딩을 다룰 때, 보통 문자열 함수로는 깨지기 쉬운 문제를 해결해 줍니다.
본문
모든 필요한 문자를 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()을 쓰는 습관이 깨짐을 예방해 줘요.