개발자 포럼

필독사항1 : 질문을 올릴 경우 답변자는 뛰어난 분석학자나 심리학자가 아님을 유의하세요. 
필독사항2 : 반드시 구체적인 설명과 코드 그리고 오류 메시지 및 캡처 이미지를 함께 올려주세요. 

 

이번에는 파이썬에서 PHP UTF-8 한글 자르기와 같은 내용으로 다뤄보겠습니다.

 

PHP와 마찬가지로 완성형 한글에서 한글 2바이트, 영어 1바이트 기준으로 잘라줍니다.

 

- UTF-8 한글 자르기

 

#-*- encoding: utf-8 -*-
import re

def strcut_utf8(str, destlen, checkmb=True, tail=""):
        """
         UTF-8 Format
          0xxxxxxx = ASCII, 110xxxxx 10xxxxxx or 1110xxxx 10xxxxxx 10xxxxxx
          라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자, 히브리 문자, 아랍 문자 는 2바이트
          BMP(Basic Mulitilingual Plane) 안에 들어 있는 것은 3바이트(한글, 일본어 포함)
        """
        slen = len(str)
        tlen = len(tail)

        if slen <= destlen:
                return str

        pattern = "[\xE0-\xFF][\x80-\xFF]{2}|."
        count=0
        text = []
        for match in re.finditer(pattern, str):
                if len(checkmb == True and match.group(0)) > 1:
                        count = count + 2
                else:
                        count = count + 1
                if (count + tlen) > destlen:
                        return "".join(text) + tail
                text.append(match.group(0))

        return "".join(text)

 

다음과 같이 5바이트를 잘라야하는데 완성형 한글 기준으로 봤을 때 5바이트 시작은 한글 '다'의 앞쪽 코드이기 때문에 한글이 깨어지지 않도록 4바이트까지만 잘라서 "가나" 문자열을 리턴합니다.

 

    print strcut_utf8("가나다라마바사아자차카타파하", 5, True, "")

    가나

 

아래와 같이 strlen 함수도 가능합니다.

 

- 완성형 한글 기준 크기 알아내기

 

#-*- encoding: utf-8 -*-
import re

def strlen_utf8(str):
        """
         UTF-8 Format
          0xxxxxxx = ASCII, 110xxxxx 10xxxxxx or 1110xxxx 10xxxxxx 10xxxxxx
          라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자, 히브리 문자, 아랍 문자 는 2바이트
          BMP(Basic Mulitilingual Plane) 안에 들어 있는 것은 3바이트(한글, 일본어 포함
)
        """
        pattern = "[\xE0-\xFF][\x80-\xFF]{2}|."
        count = 0
        for match in re.finditer(pattern, str):
                if len(match.group(0)) > 1:
                        count = count + 2
                else:
                        count = count + 1
        return count
List of Articles