본문 바로가기

PHP 한글 문자열 자르기

반응형

PHP에서 문자열을 자르기 위해서는 주로 substr 함수를 이용합니다. substr 함수는 문자열을 잘라서 그 잘린 문자열을 되돌려 주는 기능을 가지고 있는데, 자르는 기준이 바이트 단위입니다. 바이트 단위이다 보니까 한글과 같은 2바이트 문자가 포함된 경우 문자열이 온전히 끝나기 전에 잘려지는 경우 뒷 부분이 깨져서 보이게 됩니다.

아래는 substr 함수로 한글문자열을 잘라내는 간단한 예제이고 그 아래는 실행결과 입니다.


< ?php
  $title = "겨울비 내려와 머리를 적시네";

  $test = substr($title,0);

  for($i=1; $i < strlen($title); $i++ ){
    $test = substr($title,0,$i);
    echo $i.":".$test."\n<br>";
  }
?>





1:?
2:겨
3:겨?
4:겨울
5:겨울?
6:겨울비
7:겨울비
8:겨울비 ?
9:겨울비 내
10:겨울비 내?
11:겨울비 내려
12:겨울비 내려?
13:겨울비 내려와
14:겨울비 내려와
15:겨울비 내려와 ?
16:겨울비 내려와 머
17:겨울비 내려와 머?
18:겨울비 내려와 머리
19:겨울비 내려와 머리?
20:겨울비 내려와 머리를
21:겨울비 내려와 머리를
22:겨울비 내려와 머리를 ?
23:겨울비 내려와 머리를 적
24:겨울비 내려와 머리를 적?
25:겨울비 내려와 머리를 적시
26:겨울비 내려와 머리를 적시?



한글 문자열을 substr 함수로 잘랐더니 자르기 위한 바이트에 따라서 뒷 부분이 깨지고 있는게 보이실 겁니다. 아래 cutStr 함수는 한글 문자열을 깨끗하게 잘라내기 위해서 작성해 본 함수 입니다.

로직중 눈여겨 보실 부분은 ord 함수로 문자의 아스키 코드값을 체크해서 아스키 코드값이 127보다 클경우 (128부터 한글) 포함된 한글 바이트 수를 더한다는 것입니다. 그리고 마지막에 한글 바이트 수가 짝수로 딱 맞아 떨어질 때는 자르고자 하는 바이트 수 그대로 되돌리고 그렇지 않을 경우 자를 바이트 수에 1을 더한다는 것입니다.
그 이유는 한번 생각해 보시기 바랍니다. 크게 어렵지 않습니다.

< ?php
   //한글을 깨끗하게 자르기 위한 함수
   function cutStr($str,$cutbyte)
   {

      $strbyte = strlen($str); //$str 의 바이트 수를 구한다
      if($strbyte <= $cutbyte) return $str;
      for($i=0; $i<$cutbyte;$i++){
         if(ord($str[$i])>127) $hancnt++; //아스키 코드값 128부터 $hancnt를 1씩 증가시킨다
      }

      if($hancnt%2==0) $str = substr($str,0,$cutbyte);
      else $str = substr($str,0,$cutbyte+1);

      return $str;
   }

?>



아래는 cutStr 함수를 사용해서 한글을 잘라내는 예제와 실행화면입니다.

< ?php
   $title = "겨울비 내려와 머리를 적시네";
   for($i=1; $i < strlen($title); $i++ ){
      $test = cutStr($title,$i); //cutStr 함수 호출
   echo $i.":".$test."\n<br>";
   }



   //한글을 깨끗하게 자르기 위한 함수
   function cutStr($str,$cutbyte)
   {

      $strbyte = strlen($str); //$str 의 바이트 수를 구한다
      if($strbyte <= $cutbyte) return $str;
      for($i=0; $i<$cutbyte;$i++){
         if(ord($str[$i])>127) $hancnt++; //아스키 코드값 128부터 $hancnt를 1씩 증가시킨다
      }

      if($hancnt%2==0) $str = substr($str,0,$cutbyte);
      else $str = substr($str,0,$cutbyte+1);

      return $str;
   }

?>




1:겨
2:겨
3:겨울
4:겨울
5:겨울비
6:겨울비
7:겨울비
8:겨울비 내
9:겨울비 내
10:겨울비 내려
11:겨울비 내려
12:겨울비 내려와
13:겨울비 내려와
14:겨울비 내려와
15:겨울비 내려와 머
16:겨울비 내려와 머
17:겨울비 내려와 머리
18:겨울비 내려와 머리
19:겨울비 내려와 머리를
20:겨울비 내려와 머리를
21:겨울비 내려와 머리를
22:겨울비 내려와 머리를 적
23:겨울비 내려와 머리를 적
24:겨울비 내려와 머리를 적시
25:겨울비 내려와 머리를 적시
26:겨울비 내려와 머리를 적시네







※ int ord(string string);
    ord string에서 첫번째 문자의 아스키코드값을 반환합니다.

반응형

댓글


Copyright ⓒ SmartWeb All rights reserved.