title

[PHP] UTF-8 한글 자르기

Tip&Tech | 2007.07.08 16:36

utf-8 한글을 자르기 위한 함수입니다. javascript 처럼 멀티바이트 글자에 대해 1문자로 취급할 수도 있도록 했습니다. 원래대로라면 utf-8 으로 된 한글은 3byte 이지만, 익숙한 계산법을 따르기 위해서 이 함수에서는 2byte인 것처럼 취급합니다. 즉, 다음과 같습니다.

원본
한글과 English를 혼용해서 씁니다.
checkmb=true, len=10
한글과 Eng (한글=2*3 + 공백=1*1 + 영문=1*1 => 10)

checkmb=false, len=10
한글과 Englis (모두 합쳐 10자)

  1  $a '한글hangul도 포함include되었습니다.';
  2  /**
  3  * cut string in utf-8
  4  * @author gony (http://mygony.com)
  5  * @param $str     source string
  6  * @param $len     cut length
  7  * @param $checkmb if this argument is true, function treat multibyte character as two bytes. default value is false.
  8  * @param $tail    abbreviation symbol
  9  * @return string  processed string
 10  */
 11  function strcut_utf8($str$len$checkmb=false$tail='...') {
 12    preg_match_all('/[\xEA-\xED][\x80-\xFF]{2}|./'$str$match);
 13    $m    $match[0];
 14    $slen strlen($str);  // length of source string
 15    $tlen strlen($tail); // length of tail string
 16    $mlen count($m);     // length of matched characters
 17    
 18    if ($slen <= $len) return $str;
 19    if (!$checkmb  $mlen <= $len) return $str;
 20    
 21    $ret   = array();
 22    $count 0;
 23    
 24    for ($i=0$i $len$i++) {
 25      $count += ($checkmb  strlen($m[$i]) > 1)?2:1;
 26    
 27      if ($count $tlen $len) break;
 28      $ret[] = $m[$i];
 29    }
 30    
 31    return join(''$ret).$tail;
 32  }
 33  echo strcut_utf8($a15);

파라미터 설명
String $str : 원본 문자열
Integer $len : 문자열을 자를 길이
Boolean $checkmb : 이 값을 true로 하면 한글을 영문2자와 같이 취급한다. 기본값은 false
String $tail : 생략후 붙일 줄임 기호

반환값
{String} 처리된 문자열

주의! 이 함수는 UTF-8 문자열을 다룹니다. 다른 charset 에는 적용되지 않습니다.

mb_ 계열 함수가 없는 환경을 위해서 만들어봤습니다.
거의 없을 줄 알았는데 아직도 그런 환경이 있기는 있더라구요. ^^;;

[PHP]문자열에서 한글과 영문자만 추출하기

Tip&Tech | 2007.04.12 13:22

임의의문자열에서 한글과 영문자 알파벳만 추출하는 함수입니다.

문자열이 utf-8로 인코딩되어있다고 가정합니다. 따라서 utf-8을 사용하고 있지 않다면 이 함수를 사용하기 전에 iconv 등을 이용해서 인코딩을 utf-8로 변경해주셔야 합니다.

function onlyHanAlpha($subject) {
  
  $pattern '/([\xEA-\xED][\x80-\xBF]{2}|[a-zA-Z])+/';
  preg_match_all($pattern$subject$match);
  return implode(''$match[0]);
}

사용예는 다음과 같습니다.

$subject '한글입니다.옆은 일본어日本最大級일본최대급?!@#!asdf91237  ad한글%#@$하하하^%({}as23寒한문';
echo $subject;
echo "\n";
echo onlyHanAlpha($subject);