PHP에서 한글이나 일본어 같은 다중 바이트(multibyte) UTF-8 문자열을 개별 문자 단위로 분할하려면 일반적인 str_split() 함수로는 정확한 결과를 얻기 어렵습니다. 이럴 때 preg_split() 함수에 '//u' 패턴을 사용하면 문제를 깔끔하게 해결할 수 있습니다.
preg_split()과 'u' 수정자의 역할
핵심은 패턴 끝에 붙이는 'u'(UTF-8) 수정자입니다. 이 수정자를 추가하면 PCRE가 문자열을 UTF-8 모드로 처리하기 때문에, 다중 바이트 문자도 하나의 완전한 문자로 인식하여 올바르게 분할됩니다.
동시에 세 번째 인수로 -1(제한 없음), 네 번째 인수로 PREG_SPLIT_NO_EMPTY 플래그를 지정하면 빈 구분 기호로 인해 발생하는 불필요한 빈 요소들이 결과 배열에서 제거되어, 빈 구분 기호 문제까지 함께 해결됩니다.
예제 코드
다음은 실제 동작을 확인할 수 있는 PHP 예제입니다.
<!DOCTYPE html>
<html>
<body>
<?php
// 빈 문자열인 경우
$stringValues = "";
$result = preg_split('//u', $stringValues, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);
echo "<br>";
// 공백을 포함한 영문 문자열인 경우
$stringValues1 = "John Smith";
$result1 = preg_split('//u', $stringValues1, -1, PREG_SPLIT_NO_EMPTY);
print_r($result1);
?>
</body>
</html>실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
Array ( ) Array ( [0] => J [1] => o [2] => h [3] => n [4] => [5] => S [6] => m [7] => i [8] => t [9] => h )
결과 분석
- 빈 문자열 입력 시:
PREG_SPLIT_NO_EMPTY플래그 덕분에 빈 요소가 생성되지 않고 비어 있는 배열Array ( )만 반환됩니다. - "John Smith" 입력 시: 각 문자가 개별 배열 요소로 분할되며, 공백 문자 역시 하나의 요소(인덱스 4)로 그대로 유지됩니다.
이처럼 preg_split('//u', ...)와 PREG_SPLIT_NO_EMPTY 옵션을 조합하면 UTF-8 다중 바이트 문자열을 안전하게 문자 단위로 분할하면서, 빈 구분 기호로 생기는 오류도 손쉽게 방지할 수 있습니다.