Programming/PHP

PHP mb_str_split 함수가 없는 것 같아 만들어 봤습니다.(PHP 한글 물음표, 깨짐)

zzarungna 2019. 10. 26. 12:35
반응형

PHP mb_str_split 함수가 없는 것 같아 만들어 봤습니다. (PHP 한글 물음표, 깨짐)

관리하는 사이트의 웹 언어가 PHP로 되어 있었는데 해당 사이트의 인코딩은 UTF-8 형태로 되어 있었고 특정 시스템에 문자열을 보내기 위해서는 잘라낸 문자를 EUC-KR 형태로 변환해 보내야 하는 경우가 생겼습니다.

한글의 경우는 UTF-8, EUC-KR 형태에 따라 한 글자당 2바이트 또는 3바이트를 차지하기 때문에 문자를 잘라내고자 할 때 sub str 함수로 잘라내면 한글 문자가 깨집니다. 그렇기 때문에 mb_sub str 함수를 이용해 모든 글자를 한글자씩 체크해 문자를 잘라야 합니다. 그리고 저에게 필요한건 그렇게 잘라낸 문자들을 배열로 반환해주는 함수가 필요했습니다.

문자를 잘라내기 좋은 mb_sub str 함수가 있었기에 당연히 mb_sub str_split이라는 함수가 존재하지 않을까 생각했었는데 검색 능력이 안 좋아서 그런지 그런 함수를 찾을 수 없었습니다.

그래서 시간을 투자해서 mb_str_split이라는 개인적으로 만들었는데 혹시라도 필요한 분들이 있다면 참고하시면 좋을 것 같습니다.

공백이 있으면 공백을 포함하다 보니 글자 수가 부족하게 나와 보일 수 있습니다. 필요하다면 함수에 공백을 체크하는 구문도 넣어주면 좋을 것 같습니다.

만약 문자열의 형태가 UTF-8이 아니라면 함수 코드 내에 UTF-8 부분만 EUC-KR로 변경해서 사용하셔도 됩니다.

$sample_text = "한글은위대하다우리나라에세종대왕님께서는위대한문자를발명하셨다";

$result = mb_str_split($sample_text,2);

foreach($result as $key){    
    echo $key."</br>";    
}

//원하는 글자 갯수만큼 문자를 하나씩 잘라 배열에 글자들을 담아 리턴 
function mb_str_split($text, $size){    
    $count = 0;
    $order = 1;
    $text_cut = "";
    $text_array = array();    
    $text_size = ($size-1);
    
    for($i = 0; $i < mb_strlen($text, "UTF-8"); $i++){        
        if($count <= $text_size){
            $text_cut .= mb_substr($text, $i, 1, "UTF-8");            
        }
        
        if($i == $text_size || (mb_strlen($text, "UTF-8")-1) == $i){
            $order++;
            array_push($text_array, $text_cut);
            $text_cut = "";
            $text_size = ($size*$order);
            $count = ($text_size-$size);            
        }
        
        $count++;
        
    }
    return $text_array;
}

 

보이는 결과 화면은 단순히 문자열을 잘라낸 것처럼 보이지만 2글자씩 글자를 잘라 배열 형태로 반환 받은 형태입니다.


 

개인적으론 기존 PHP에서 제공하는 기존 함수들을 활용해 새로운 함수를 만들어 보게 되어 좋았던 것 같습니다. 프로그래밍 관련 머리가 좋은 편은 아니라서 하나씩 테스트하면서 만든 함수이다 보니 조금 지저분한 것 같기도 합니다.

반응형