PHP 를 시작한지 얼마안되었을때. substr()로 문자열을 잘라보니 문자열이 자주 깨졌다.
알고보니 substr()은 2byte로 문자열을 자르기 때문에 UTF-8 인코딩을 쓸 경우 3byte라 함수가 제대로 동작을 한했던 것.
방법이 없나 구글링을 해보니
같은 사람들이 직접 만든 함수들이 검색되었다.
'대체 왜 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 가 제대로 나온다.
즉, 잘 동작한다.