완성형 한글의 경우 한글은 2바이트로 영어는 1바이트로 구성되기 때문에 PHP의 substr() 함수를 쓸 때 한글이 깨지는 경우가 있다. 이런 경우 mb_substr() 함수로 대체하면 된다.
substr ($str, $start_Pos, $length);
$Str에 담고 있는 문자열의 $start_Pos부터 길이$length만큼을 잘라내어 반환한다
mb_substr ($str, $start_Pos, $length, $encoding);
$str에 담고 있는 문자열의 $start_Pos부터 길이$length만큼을 잘라내어 $encoding 형식에 맞게 반환한다
mb_substr($str, 0, 10, 'EUC-KR');
mb_substr($str, 0, 10, 'UTF-8');
function strcut_euckr($msg, $limit) { // 완성형 한글 자르기
$msg = substr($msg, 0, $limit);
for ($i = $limit - 1; $i > 1; $i--) {
if (ord(substr($msg,$i,1)) < 128) break;
}
$msg = substr($msg, 0, $limit - ($limit - $i + 1) % 2);
return $msg;
}
function strcut_utf8($str, $len, $checkmb=false, $tail='') { // UTF-8 한글자르기
/** UTF-8 Format
* 0xxxxxxx = ASCII, 110xxxxx 10xxxxxx or 1110xxxx 10xxxxxx 10xxxxxx
* latin, greek, cyrillic, coptic, armenian, hebrew, arab characters consist of 2bytes
* BMP(Basic Mulitilingual Plane) including Hangul, Japanese consist of 3bytes
**/
preg_match_all('/[\xE0-\xFF][\x80-\xFF]{2}|./', $str, $match); // target for BMP
$m = $match[0];
$slen = strlen($str); // length of source string
$tlen = strlen($tail); // length of tail string
$mlen = count($m); // length of matched characters
if ($slen <= $len) return $str;
if (!$checkmb && $mlen <= $len) return $str;
$ret = array();
$count = 0;
for ($i=0; $i < $len; $i++) {
$count += ($checkmb && strlen($m[$i]) > 1)?2:1;
if ($count + $tlen > $len) break;
$ret[] = $m[$i];
}
return join('', $ret).$tail;
}
※ 문자열의 '바이트 수'를 확인하려면 strlen() 함수를, '문자 수'를 조사하려면 mb_strlen() 함수를 사용해야 한다.
영문이나 숫자 등의 싱글 바이트 문자로 구성된 문자열에서는 strlen() 함수와 mb_strlen() 함수의 결과는 같다.
하지만, 멀티바이트 문자를 포함하는 문자열(한국어, 일본어, 중국어 등)에서는 결과가 다르다.
'Web 프로그램 > PHP 응용 및 활용' 카테고리의 다른 글
[PHP] 쿠키와 세션, 그리고 보안 (0) | 2015.05.27 |
---|---|
[PHP] 홈페이지 설정 정보 확인 (0) | 2015.04.28 |
PHP 기본 함수 (0) | 2015.03.07 |
IP 체크 (0) | 2014.05.18 |
GET, POST 변수전달 (0) | 2014.05.15 |