sub_title
 PHP
제   목 PHP 한글 문자열 자르기
작성자 웹마당넷 등록일 2008-12-27 18:22:08 조회수 11,834

[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에서 첫번째 문자의 아스키코드값을 반환합니다.

작성자: 웹마당넷(webmadang@webmadang.net)   http://www.webmadang.net
 
0
    
 
0
        list
 
※ 짧은 댓글일수록 예의를 갖추어 작성해 주시기 바랍니다.
line
reply cancel
 
번호 제목 글쓴이 추천 조회 날짜
55  PHP - 파일다운로드 함수   member 오렌지 0 / 0 12940 2009-03-07
54  fsockopen 함수를 이용해서 웹사이트에 데이터 전송하기   member 높이뜬새 2 / 0 11593 2009-03-06
53  PHP - 웹사이트의 유효성 체크   member 오렌지 0 / 0 7963 2009-02-28
52  PHP 현재 페이지의 도메인명이나 url등의 정보 알아오기   member 높이뜬새 6 / 0 108282 2009-02-27
51  PHP 파일 한줄 읽기(fgets함수)   admin 웹마당넷 0 / 0 32675 2009-02-24
50  PHP 파일 내용 읽기(fread함수)   admin 웹마당넷 3 / 0 27189 2009-02-15
49  PHP 파일 시스템(File System) 다루기 #1   admin 웹마당넷 0 / 0 21355 2009-02-14
48  PHP 썸네일(Thumbnail) 이미지 만들기 함수 첨부파일   member 티란투라 0 / 0 10646 2009-02-08
47  PHP - xml 읽어들이기(read) 클래스   member 오렌지 0 / 0 9398 2009-02-08
46  PHP와 자바스크립트를 이용한 드롭다운 메뉴 첨부파일   member 오렌지 0 / 0 11843 2009-02-07
45  PHP로 MySQL 데이터베이스 만들기(생성하기)   admin 웹마당넷 1 / 0 10407 2009-01-24
44  PHP MySQL 명령어 실행 함수 mysql_query   admin 웹마당넷 1 / 0 47227 2009-01-21
43  PHP 에러 처리 함수 die   admin 웹마당넷 4 / 0 41735 2009-01-20
42  PHP no-cache 설정(뒤로가기 막기)   admin 웹마당넷 1 / 0 31223 2009-01-17
41  PHP 폼(form)값의 유효성 체크   admin 운영자 0 / 0 9769 2009-01-13
40  PHP - SELECT로 반환된 레코드 갯수와 컬럼의 갯수를 알려주는 함수   admin 웹마당넷 0 / 0 18910 2009-01-11
39  PHP 버전 확인하기   admin 웹마당넷 0 / 0 13007 2009-01-06
38  PHP 한글 문자열 자르기   admin 웹마당넷 0 / 0 11834 2008-12-27
37  PHP 오늘날짜를 기준으로 이전,이후 날짜구하기   admin 웹마당넷 0 / 1 15206 2008-12-25
36  PHP 이름이 같은 폼태그(Form Tag)의 값(value) 처리하기   admin 웹마당넷 0 / 0 33195 2008-12-06
35  PHP split 함수를 이용한 문자열 분리   admin 웹마당넷 1 / 0 52817 2008-12-06
34  PHP explode 함수를 이용한 문자열 분리   admin 웹마당넷 0 / 0 11565 2008-12-01
33  PHP 달력(Calendar) 입니다. 이미지  [1] member 티란투라 0 / 0 11330 2008-11-16
32  플래쉬 무비클립을 캡쳐하는 PHP 소스 입니다. 첨부파일   member 사라마음 0 / 0 7103 2008-11-14
31  PHP에서 세션(session) 사용하기   member 웹스톤 0 / 0 14094 2008-08-31
write
button [1] [3] [4] button