Source code for konlp.misc.kconv.kconv

# Copyright (C) 2017 - 0000 KoNLTK project
#
# Korean Natural Language Toolkit: korean converter
#
# Author: GyuHyeon Nam <ngh3053@gmail.com>
#         Hyunyoung Lee <hyun02.engineer@gmail.com>
#         Seungshik Kang <sskang@kookmin.ac.kr>
# URL: <https://www.konltk.org>
# For license information, see LICENSE.TXT
# ========================================================
"""
kconv - 한국어 인코딩 변환도구

kconv 는 국민대학교 강승식 교수님이 만든 한국어 인코딩 변환 도구 입니다.
파일이나 스트링에 대한 인코딩 변환을 도와주는 도구들이 있습니다.
EUC-KR, UTF-8, UTF-16-LE, UTF-16-BE 간의 인코딩 변환을 지원합니다.

Example:
    >>> from konlp.misc import kconv
    >>> sample_txt = "안녕하세요. 국민대학교 자연어처리 연구실입니다."
    >>> encoded_txt = kconv.convert(sample_txt, 'EUC_KR', 'UTF_8')
    >>> encoded_txt
    b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94. \xea\xb5\xad\xeb\xaf\xbc\xeb\x8c\x80\xed\x95\x99\
    \xea\xb5\x90 \xec\x9e\x90\xec\x97\xb0\xec\x96\xb4\xec\xb2\x98\xeb\xa6\xac \xec\x97\xb0\xea\xb5\xac\xec\x8b\xa4\xec\
    \x9e\x85\xeb\x8b\x88\xeb\x8b\xa4.'
    >>> file_dir = 'input.txt'
    >>> kconv.scan(file_dir)
    >>> kconv.convert_file(file_dir, 'output.txt', 'UTF_8', 'UTF_16_LE')
"""
import os

from .lib.kconv_wrapper import convert as _convert
from .lib.kconv_wrapper import convert_file as _convert_file
from .lib.kconv_wrapper import scan as _scan
from .lib.kconv_wrapper import synopsis as _synopsis


def _cvt_enc_name(enc):
    """인코딩 이름 변환 함수

    사용자가 정의한 인코딩 이름을 kconv 인코딩 이름 규칙에 맡게 변환하는 함수.
    EUC_KR, CP949, UTF_8, UTF_8_BOM, UTF_16_LE, UTF_16_BE 이 존재.

    Args:
        enc (str): 사용자가 정의한 인코딩 이름

    Returns:
        str: kconv 인코딩 이름

    Raises:
        ValueError: 정의되지 않은 인코딩 이름이 들어올 경우 발생
    """
    class Encoding:
        """
        인코딩 이름 클래스
        """
        CP949 = 'CP949'
        EUC_KR = 'EUC_KR'
        UTF_8 = 'UTF_8'
        UTF_8_BOM = 'UTF_8_BOM'
        UTF_16_LE = 'UTF_16_LE'
        UTF_16_BE = 'UTF_16_BE'

    enc = enc.lower().replace('_', '').replace('-', '')

    if enc == 'cp949':
        return Encoding.CP949
    elif enc == 'euckr':
        return Encoding.EUC_KR
    elif enc == 'utf8':
        return Encoding.UTF_8
    elif enc == 'utf8bom':
        return Encoding.UTF_8_BOM
    elif enc == 'utf16le':
        return Encoding.UTF_16_LE
    elif enc == 'utf16be':
        return Encoding.UTF_16_BE
    else:
        raise ValueError('Unknown encoding type : {}'.format(enc))

[docs]def synopsis(): """kconv 사용 설명 함수""" _synopsis()
[docs]def convert(string, in_enc, out_enc): """스트링 인코딩 변환 함수 주어진 스트링과 인코딩 변환 규칙을 바탕으로 인코딩 작업을 수행합니다. 스트링은 str, bytes 타입이여야 하고, 반환값은 항상 bytes 타입입니다. 입력 스트링의 타입이 str 일 경우, 입력 인코딩을 자동으로 `EUC_KR`로 인식됩니다. Args: string (str): 혹은 bytes 타입도 가능. 인코딩 변환할 스트링. in_enc (str): string의 현재 인코딩 타입. out_enc (str): 변환할 인코딩 타입. Returns: bytes: 인코딩 변환된 bytes string """ if not isinstance(string, str) and not isinstance(string, bytes): raise TypeError('string type must be string or bytes') in_enc = _cvt_enc_name(in_enc) out_enc = _cvt_enc_name(out_enc) return _convert(string, in_enc, out_enc)
[docs]def convert_file(infile_dir, outfile_dir, in_enc, out_enc): """파일 인코딩 변환 함수 주어진 파일 경로와 인코딩 변환 규칙을 바탕으로 인코딩 작업을 수행합니다. 인코딩 변환된 파일은 저장 경로에 항상 덮어씁니다. Args: infile_dir (str): 변환할 파일 경로 outfile_dir (str): 변환된 파일의 경로 in_enc (str): 현재 파일의 인코딩 타입 out_enc (str): 변환된 파일의 인코딩 타입 """ if not os.path.exists(infile_dir): raise FileNotFoundError('Can not find infile in the path : {}'.format(infile_dir)) in_enc = _cvt_enc_name(in_enc) out_enc = _cvt_enc_name(out_enc) _convert_file(infile_dir, outfile_dir, in_enc, out_enc)
[docs]def scan(file_dir): """파일 인코딩 탐지 함수 주어진 파일 경로에서 파일의 인코딩을 탐지하는 함수입니다. Args: file_dir (str): 인코딩을 탐지할 파일 경로 Returns: int: 인코딩 타입 """ if not os.path.exists(file_dir): raise FileNotFoundError('Can not find file in the path : {}'.format(file_dir)) return _scan(file_dir)