cut_str 함수에서 UTF-8을 위한 마지막 글자 처리 정보
cut_str 함수에서 UTF-8을 위한 마지막 글자 처리본문
common.lib.php 파일 내부의 cut_str() 함수를 일단 한번 수정해봤습니다.
제가 이쪽분야로는 워낙 지식이 짧은 관계로, 첨부된 그림파일 정도의 테스트를 해보고 올립니다.
고수님들께서 한번 검토해보시고 오류가 있으면 댓글을 가차없이 달아주시기 바랍니다. ^^;
4바이트는 사용되는 일이 거의 없다라고 하던데, 그냥 넣었습니다. (ㅡ.ㅡ;)a
그리고, 중간문자가 깨질 수 있는 상황에 대해서는 고려하지 않았습니다.
참고로, 그림의 문자들은... 다른나라 글자하고는 별로 친하지 않은 관계로 무슨 내용인지는 모릅니다. ㅡ.ㅡ;
function cut_str($str, $len, $suffix="…")
{
global $g4;
$s = substr($str, 0, $len);
$cnt = 0; // 마지막 글자에서 잘린 후 남겨진 바이트 수
$s_len = strlen($s);
// UTF-8 마지막 글자 깨짐 처리
if (strtoupper($g4['charset']) == 'UTF-8') {
for ($i=0; $i<$s_len; $i++) {
$oc = ord($s[$i]);
if ( ($oc & 0xF8) == 0xF0 ) // 4byte
{
if ($i+4 >= $s_len) { $cnt = ($s_len-$i)%4; break; }
else $i+=3;
}
else if ( ($oc & 0xF0) == 0xE0 ) // 3byte
{
if ($i+3 >= $s_len) { $cnt = ($s_len-$i)%3; break; }
else $i+=2;
}
else if ( ($oc & 0xE0) == 0xC0 ) // 2byte
{
if ($i+2 >= $s_len) { $cnt = ($s_len-$i)%2; break; }
else $i++;
}
else // 1byte
$cnt = 0;
}
if ($cnt)
$s = substr($s, 0, $s_len - $cnt);
}
else // EUC-KR, 마지막 글자 깨짐 처리
{
for ($i=0; $i<$s_len; $i++) {
$oc = ord($s[$i]);
if ( $oc > 0x7F )
{
if ($i+2 >= $s_len ) { $cnt = ($s_len-$i)%2; break; }
else $i++;
}
else
$cnt = 0;
}
if ($cnt)
$s = substr($s, 0, $s_len - $cnt);
}
if (strlen($s) >= strlen($str))
$suffix = "";
return $s . $suffix;
}
제가 이쪽분야로는 워낙 지식이 짧은 관계로, 첨부된 그림파일 정도의 테스트를 해보고 올립니다.
고수님들께서 한번 검토해보시고 오류가 있으면 댓글을 가차없이 달아주시기 바랍니다. ^^;
4바이트는 사용되는 일이 거의 없다라고 하던데, 그냥 넣었습니다. (ㅡ.ㅡ;)a
그리고, 중간문자가 깨질 수 있는 상황에 대해서는 고려하지 않았습니다.
참고로, 그림의 문자들은... 다른나라 글자하고는 별로 친하지 않은 관계로 무슨 내용인지는 모릅니다. ㅡ.ㅡ;
function cut_str($str, $len, $suffix="…")
{
global $g4;
$s = substr($str, 0, $len);
$cnt = 0; // 마지막 글자에서 잘린 후 남겨진 바이트 수
$s_len = strlen($s);
// UTF-8 마지막 글자 깨짐 처리
if (strtoupper($g4['charset']) == 'UTF-8') {
for ($i=0; $i<$s_len; $i++) {
$oc = ord($s[$i]);
if ( ($oc & 0xF8) == 0xF0 ) // 4byte
{
if ($i+4 >= $s_len) { $cnt = ($s_len-$i)%4; break; }
else $i+=3;
}
else if ( ($oc & 0xF0) == 0xE0 ) // 3byte
{
if ($i+3 >= $s_len) { $cnt = ($s_len-$i)%3; break; }
else $i+=2;
}
else if ( ($oc & 0xE0) == 0xC0 ) // 2byte
{
if ($i+2 >= $s_len) { $cnt = ($s_len-$i)%2; break; }
else $i++;
}
else // 1byte
$cnt = 0;
}
if ($cnt)
$s = substr($s, 0, $s_len - $cnt);
}
else // EUC-KR, 마지막 글자 깨짐 처리
{
for ($i=0; $i<$s_len; $i++) {
$oc = ord($s[$i]);
if ( $oc > 0x7F )
{
if ($i+2 >= $s_len ) { $cnt = ($s_len-$i)%2; break; }
else $i++;
}
else
$cnt = 0;
}
if ($cnt)
$s = substr($s, 0, $s_len - $cnt);
}
if (strlen($s) >= strlen($str))
$suffix = "";
return $s . $suffix;
}
추천
2
2
댓글 15개
좋은 정보 감사합니다.....제홈에 모셔가도 될까요?.....^^
네... 데려가주시면 저야 고마울 따름입니다.
녀석이 자꾸만 귀찮게해서...
이 기회에 천상재회님께 입양을... d(ㅡ.ㅡ;)
녀석이 자꾸만 귀찮게해서...
이 기회에 천상재회님께 입양을... d(ㅡ.ㅡ;)
감사합니다...제홈에 이미지까징 입양을 했더니 요상한 현상이 나옵니당....ㅠ.ㅠ
목록에 저 이미지 잔상이 움직입니다......호호호~~**
놀랠 노자라고 쳐다보고 있습니다......
목록에 저 이미지 잔상이 움직입니다......호호호~~**
놀랠 노자라고 쳐다보고 있습니다......
오오오오~ 정말로 신기하네요... ㅡ.ㅜ;
아직 홈 구성 단계라 열람은 안되지만 익스와 불여우에서 똑 같은 현상에 눈이 헤롱헤롱 합니다.^^
로긴해서 보라고 당당하게 "얼러리요?" 창이 뜨네요.
음.. 저건 뭔일이래요 천상재회님.
저도 모릅니다. 일반 화일 첨부로 올리고 보니 익스나 불여우나 같은 현상이 나옵니다.....^^
UTF-8의 길은 멀고도 험난하군요. euc_kr 만세!
뭔말씀리애유...제홈은 UTF-8 지원안되고 그냥 글하나 쓴 것 뿐인디유....^^
아. 위의 원글내용이 utf-8 그누보드를 깔고 스킨을 깔았을때 발생하는 문제를 해결하기 위한 방법으로 어쩌구 저쩌구 궁시렁 나불나불~ 하여 천상재회님도 해결책이 없어 위의 방법을 따라하였는데
UTF-8 이라서 혹시 문제가 있어서 첨부한 파일이 뿌려짐과 동시에 위에 리스트가 뿌려지고 기타등등 나불나불~ 어쩌구 하는 문제때문에 그렇게 출력되는 줄 알고 한 말이었습니다.
UTF-8 이라서 혹시 문제가 있어서 첨부한 파일이 뿌려짐과 동시에 위에 리스트가 뿌려지고 기타등등 나불나불~ 어쩌구 하는 문제때문에 그렇게 출력되는 줄 알고 한 말이었습니다.
역시 ~~~**
좋은 정보 감사합니다
오~ 한번 적용해봐야징..
짱이세요~