[utf-8, PHP5] 한글 자르기 정보
[utf-8, PHP5] 한글 자르기본문
그누보드/lib/common.lib.php line 890
// 한글 한글자(2byte)는 길이 2, 공란.영숫자.특수문자는 길이 1
function cut_str($str, $len, $suffix="…")
{ $s = iconv_substr($str, 0, $len, "utf-8"); //<-- 여기 추가, 아래 주석처리 !
// $s = substr($str, 0, $len);
// $cnt = 0;
// for ($i=0; $i<strlen($s); $i++)
// if (ord($s[$i]) > 127)
// $cnt++;
// $s = substr($s, 0, $len - ($cnt % 2));
if (strlen($s) >= strlen($str))
$suffix = "";
return $s . $suffix;
}
* 참고: PHP5에 iconv_substr( string str, int offset [, int length [, string charset]] ) 내장되었네요.
* utf-8 적용시 cut_str()으로 잘 안될 때가 있어서 수정해봤습니다.
// 한글 한글자(2byte)는 길이 2, 공란.영숫자.특수문자는 길이 1
function cut_str($str, $len, $suffix="…")
{ $s = iconv_substr($str, 0, $len, "utf-8"); //<-- 여기 추가, 아래 주석처리 !
// $s = substr($str, 0, $len);
// $cnt = 0;
// for ($i=0; $i<strlen($s); $i++)
// if (ord($s[$i]) > 127)
// $cnt++;
// $s = substr($s, 0, $len - ($cnt % 2));
if (strlen($s) >= strlen($str))
$suffix = "";
return $s . $suffix;
}
* 참고: PHP5에 iconv_substr( string str, int offset [, int length [, string charset]] ) 내장되었네요.
* utf-8 적용시 cut_str()으로 잘 안될 때가 있어서 수정해봤습니다.
추천
1
1
댓글 6개
PHP4에서도 extention으로 iconv가 가능은 한것 같던데.... (사용은 제대로 못해봤군요...)
mb_string을 사용하는 것은 어떨까요? extention으로 지원하는데요... (PHP 4 >= 4.0.6, PHP 5)
KOI8-R, EUC-KR, UTF-8 도 가능하고 mb_substr, mb_split, mb_strcut, mb_strlen, mb_substr_count 등과
정규식 함수(mb_ereg...)를 포함하여 웬만한 PHP의 String 함수들은 가능하거든요...
mb_string을 사용하는 것은 어떨까요? extention으로 지원하는데요... (PHP 4 >= 4.0.6, PHP 5)
KOI8-R, EUC-KR, UTF-8 도 가능하고 mb_substr, mb_split, mb_strcut, mb_strlen, mb_substr_count 등과
정규식 함수(mb_ereg...)를 포함하여 웬만한 PHP의 String 함수들은 가능하거든요...
iconv를 이용해서 변환을 해도 되지만 utf8 그대로 자르는 것도 가능해서 한번 만들어봤습니다.
utf8은 바이트수가 3~6 바이트까지 차지하므로(한글은 거의 3바이트) euckr에 비해 1.5배가량 넉넉하게 글자수를 지정해줘야 비슷한 만큼 잘리는거 주의하시고요^^
utf8은 글자 중간에 딱 찝었을때도 이게 한글인지 아닌지 파악이 가능하기때문에 일반적인 멀티바이트 자르기보다 훨씬 루프를 적게 돌고 자를 수 있습니다.
사이트 전체가 utf8로 된 경우라면 활용하세요 (_ _)
function utf8_cutstr($str,$len,$tail='') {
$c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
if ($c == '10')
for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));
return substr($str,0,$len) . (strlen($str)-strlen($tail) >= $len ? $tail : '');
}
header('Content-Encoding: UTF-8');
$str ="UTF8로 작성된 한글 메시지 123 ★♧ 家羅多";
for ($i=1,$cnt=strlen($str);$i<=$cnt;$i++) {
echo "{$i}: ". utf8_cutstr($str,$i,'...'). '<br />';
}
utf8은 바이트수가 3~6 바이트까지 차지하므로(한글은 거의 3바이트) euckr에 비해 1.5배가량 넉넉하게 글자수를 지정해줘야 비슷한 만큼 잘리는거 주의하시고요^^
utf8은 글자 중간에 딱 찝었을때도 이게 한글인지 아닌지 파악이 가능하기때문에 일반적인 멀티바이트 자르기보다 훨씬 루프를 적게 돌고 자를 수 있습니다.
사이트 전체가 utf8로 된 경우라면 활용하세요 (_ _)
function utf8_cutstr($str,$len,$tail='') {
$c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
if ($c == '10')
for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));
return substr($str,0,$len) . (strlen($str)-strlen($tail) >= $len ? $tail : '');
}
header('Content-Encoding: UTF-8');
$str ="UTF8로 작성된 한글 메시지 123 ★♧ 家羅多";
for ($i=1,$cnt=strlen($str);$i<=$cnt;$i++) {
echo "{$i}: ". utf8_cutstr($str,$i,'...'). '<br />';
}
좋은 방법인 것 같습니다. 감사합니다. 다만 warning이 있어 보니 $str{$len}에서 $len 값은 반드시 $str의 길이에서 하나뺀 값보다 작아야 하므로(스트링의 시작은 1이 아니라 0 이므로) 다음과 같이 수정해서 warning을 없앴습니다.
function utf8_cutstr($str,$len,$tail='')
{
if ($len < strlen($str)) {
$c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
if ($c == '10')
for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));
}
return substr($str,0,$len) . (strlen($str)-strlen($tail) >= $len ? $tail : '');
}
function utf8_cutstr($str,$len,$tail='')
{
if ($len < strlen($str)) {
$c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
if ($c == '10')
for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));
}
return substr($str,0,$len) . (strlen($str)-strlen($tail) >= $len ? $tail : '');
}
음 지금 생각해보니, 그냥 if ($len == strlen($str)) return $str; 이게 좋을 듯하네요.
하나의 함수로 영문과 국문을 동시에 비슷하게 자르게 해 놓으면 아주 편리할텐데요^^
뭐 글자 수 정도로 자르기?;;
뭐 글자 수 정도로 자르기?;;
수고하셨습니다. 감사합니다.