본문 바로가기

PHP

[PHP] UTF-8 문자열 자르기 (멀티바이트 문자열 자르기)

PHP 를 시작한지 얼마안되었을때. substr()로 문자열을 잘라보니 문자열이 자주 깨졌다.

알고보니 substr()은 2byte로 문자열을 자르기 때문에 UTF-8 인코딩을 쓸 경우 3byte라 함수가 제대로 동작을 한했던 것.


방법이 없나 구글링을 해보니

UTF-8 한글 자르기

같은 사람들이 직접 만든 함수들이 검색되었다.


'대체 왜 php는 2byte 문자밖에 지원을 안하는거지?' 라고 생각하며 저런 함수들을 쓰던중

우연히 레퍼런스를 뒤지다 찾게 되었는데...


PHP 4.0.6 부터 Multibyte String Functions 해서 이미 지원하고 있었다 -_-;;;;

(레퍼런스를 꼼꼼히 살펴보지 않은 실수)


substr과 사용법은 사실상 다를바 없고

다음 과 같이

mb_substr($str, 0, [1], ["UTF-8"]

앞에 mb_가 붙으며 length 뒤에 인코딩 타입을 지정하는 옵션인수가 하나 더 늘어났다.


인코딩 타입은 생략이 가능하지만 가급적 명시해 주는게 좋고, 아니라면

mb_internal_encoding("UTF-8") 을 이용하여 확실하게 적용할 인코딩 타입을 정하고 사용하는게 좋다.

(이런거 없이 그냥 사용하면 서버환경이나, 문서 설정에 따라 인코딩이 꼬일 수 있다)



덧.

php 레퍼런스 밑 댓글중에 제대로 동작 안하는 것처럼 보이는 리플이 있는데

<?php

function substr_unicode($str, $s, $l = null) {

    return join("", array_slice(

        preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l));

}


$str = "Büyük";

$s = 0; // start from "0" (nth) char

$l = 3; // get "3" chars

echo substr($str, $s, $l) ."\n";    // Bü

echo mb_substr($str, $s, $l) ."\n"; // Bü

echo substr_unicode($str, $s, $l);  // Büy

?>

위 코드에서

echo mb_substr($str, $s, $l) ."\n";   -> echo mb_substr($str, $s, $l, "UTF-8") ."\n";

해주면 원하는 결과값인 Büy 가 제대로 나온다.

즉, 잘 동작한다.