개발자 포럼
필독사항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