PHP

2byte 문자 상관없이 글자수로 자르기

0hee 2007. 7. 6. 09:12
한글때문에 이런 함수를 만들어 볼까 생각했습니다.
byte 수가 문젠데요..
$a = "가나다라"
substr( $a, 0, 2 ); 를 해야 "가" 한글자만 나옵니다.
어짜피 2byte 문자에서 1/2 바이트는 쓸모도 없으니 걍 한글이던 영문이던 글자수로 자르는
게 속이 편할거 같아 만들었습니다..

// 글자수를 자르기 위한 함수
// $String 자를 문자열
// $Length 제한할 문자열 수
// $EndMark 실제로 문자열이 잘리면 뒤에 붙여질 마크
function StringCut( $String, $Length, $EndMark='' )
{
// 자를필요없으면 리턴
if( strlen( $String ) <= $Length ) return $String;

for( $i=0; $i<strlen( $String ); $i++ )
{
//아스키코드 129 번부터는 2 Byte 문자
//2 Byte 문자인경우 1 Byte 를 더 읽은 샘으로 침.
if( ord( substr( $String, $i-1, $i ) ) > 128 )
{
$i++;
$Length++;
}
//$Length 까지 왔을경우 리턴
if( $i >= $Length )
return substr( $String, 0, $Length ).$EndMark;
}
// 자를필요가 없지만 글자수와 byte 수를 비교하지 못함으로
// 루프를 다돌아도 리턴되지 않는다면 그냥 월래 문자열 return;
return $String;
}

$a = "첫번째줄을 abcde";
----------------------
[결과]
1:첫
2:첫번
3:첫번째
4:첫번째줄
5:첫번째줄을
6:첫번째줄을
7:첫번째줄을 a
8:첫번째줄을 ab
9:첫번째줄을 abc
10:첫번째줄을 abcd
11:첫번째줄을 abcde

보시면 알겠지만.. 앞의 숫자는 $Length 입니다.
그리고 5, 6 번을 보면 똑같은거 같지만 공백이 하나 들어가서 6번은
글자수가 6으로 됩니다.

이거 만들면서 좀 궁금했던 상황은
ascii 코드 128번이 1바이트인가요? 2바이트 인가요?
어디서 봤는데 128번도 2바이트라고 하던데..암튼 전 129번부터 2바이트로 첬습니다.-_-;

참고

ord

(PHP 3, PHP 4, PHP 5)

ord -- 문자의 아스키 값을 반환합니다.

설명

int ord ( string string )

string에서 첫번째 문자의 아스키 값을 반환합니다. 이 함수는 chr()을 보충합니다.

예 1. ord() 예제

$str = "\n";
if (ord($str) == 10) {
    echo "\$str의 첫번째 문자는 줄바꿈입니다.\n";
}

아스키 표는 http://www.asciitable.com에서 확인할 수 있습니다.

참고: chr().