머드클럽
머드게임이란?
게임은 어떤 환경에서?
본격적으로 게임해 볼까?
배너교환
머드강좌
일반 머드강좌
성천사님의 머드강좌
혼님의 머드강좌
방울꽃님의 머드강좌
리트님의 머드강좌
2Soo님의 머드강좌
내머드소개하기
접속가능머드
내머드소개하기
자료실
접속 프로그램
머드소스
머드 유틸리티
기타
커뮤니티
공지사항
등업신청
머드클럽에바란다
자유 게시판
질문 AND 답변
머드클럽 갤러리
구인구직
머드게임소개
사신전(死神戰)
사신전 소개
사신전 맵
사신전 명령어 모음집
천명(天命)
천명 소개
천명 맵
천명 명령어 모음집
마이페이지
로그인
회원가입
계정찾기
로그인
회원가입
계정찾기
텍스트머드클럽
검색
[기타]UTF-8 한글 조사처리 (파이썬, c)
암로
0
58
0
0
2025-01-01 08:33:53
<p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">처리되는 조사 목록:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">은/는:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">받침이 있는 경우 '은', 없는 경우 '는'을 선택합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">예: "학교<strong _ngcontent-ng-c2971488233="">는</strong>", "책<strong _ngcontent-ng-c2971488233="">은</strong>", "사과3<strong _ngcontent-ng-c2971488233="">은</strong>"</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">이/가:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">받침이 있는 경우 '이', 없는 경우 '가'를 선택합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">예: "사람<strong _ngcontent-ng-c2971488233="">이</strong>", "바나나<strong _ngcontent-ng-c2971488233="">가</strong>", "배1<strong _ngcontent-ng-c2971488233="">이</strong>"</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">을/를:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">받침이 있는 경우 '을', 없는 경우 '를'을 선택합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">예: "밥<strong _ngcontent-ng-c2971488233="">을</strong>", "차<strong _ngcontent-ng-c2971488233="">를</strong>", "사과<strong _ngcontent-ng-c2971488233="">를</strong>"</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">으로/로:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">받침이 없거나 'ㄹ' 받침으로 끝나는 경우 '로'를 선택합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">그 외 받침이 있는 경우 '으로'를 선택합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">예: "서울<strong _ngcontent-ng-c2971488233="">로</strong>", "부산<strong _ngcontent-ng-c2971488233="">으로</strong>", "달<strong _ngcontent-ng-c2971488233="">로</strong>", "사과7<strong _ngcontent-ng-c2971488233="">로</strong>"</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">과/와:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">받침이 있는 경우 '과', 없는 경우 '와'를 선택합니다</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">예: "동물<strong _ngcontent-ng-c2971488233="">과</strong>", "강아지<b>와</b>"</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">이란/란:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">받침이 있는 경우 '이란', 없는 경우 '란'을 선택합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">예: "터키<strong _ngcontent-ng-c2971488233="">란</strong>", "미국<strong _ngcontent-ng-c2971488233="">이란</strong>"</p> </li> </ul> </li> </ul> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">파이썬 코드 사용 설명서:</strong></p> <ol _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">JosaRule 클래스:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">__init__(self, josa_type, has_batchim, josa_with_batchim, josa_without_batchim): 조사 규칙 객체를 초기화합니다.</p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">josa_type: 조사 유형 (예: "은/는", "이/가", "을/를", "으로/로", "과/와", "이란/란")</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">has_batchim: 받침 유무에 따른 조사 선택 기준 (현재 코드에서 사용되지 않음)</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">josa_with_batchim: 받침이 있을 때 사용할 조사 (예: "은", "이", "을", "으로", "과", "이란")</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">josa_without_batchim: 받침이 없을 때 사용할 조사 (예: "는", "가", "를", "로", "와", "란")</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">apply(self, word): 주어진 단어에 대해 적절한 조사를 선택합니다.</p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">단어의 마지막 글자의 받침 여부와, 'ㄹ' 받침 여부를 확인하여 조사를 선택합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">self._has_batchim() 메서드를 사용하여 받침 여부를 확인합니다.</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">_has_batchim(self, char): 주어진 문자의 받침 여부를 확인하고, 'ㄹ' 받침인지 여부를 반환합니다.</p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">숫자 1, 3, 6, 0은 받침 있는 것으로 처리합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">숫자 7, 8은 받침이 있고, 'ㄹ' 받침으로 처리합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">캐싱을 사용하여 성능을 향상시킵니다.</p> </li> </ul> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">JosaSelector 클래스:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">__init__(self): 조사 선택기 객체를 초기화합니다.</p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">rules 딕셔너리: 조사 유형을 키로 하여 JosaRule 객체를 저장합니다.</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">select_josa(self, word, josa_type): 단어와 조사 유형에 따라 적절한 조사를 선택하여 반환합니다.</p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">josa_type에 해당하는 JosaRule 객체를 rules 딕셔너리에서 찾습니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">josa_type이 "으로/로"이면 _has_batchim를 직접 호출해서 처리합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">그 외에는 JosaRule.apply 메서드를 호출하여 조사를 선택합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">단어 또는 조사 유형이 없으면 ValueError를 발생시킵니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">해당 조사 유형을 찾을 수 없으면 ValueError를 발생시킵니다.</p> </li> </ul> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">사용 예시:</strong></p> <pre _ngcontent-ng-c257604760=""> <code _ngcontent-ng-c257604760="">if __name__ == "__main__": josa_selector = JosaSelector() try: print(josa_selector.select_josa("물", "을/를")) # 물을 print(josa_selector.select_josa("밥", "을/를")) # 밥을 print(josa_selector.select_josa("서울", "으로/로")) # 서울로 # ... except ValueError as e: print(f"오류: {e}")</code> </pre> </li> </ol> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">C 코드 사용 설명서:</strong></p> <ol _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">헤더 파일:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">stdio.h: 표준 입출력 함수를 제공합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">string.h: 문자열 관련 함수를 제공합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">stdbool.h: bool 타입 및 관련 매크로를 제공합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">stdlib.h: 일반적인 유틸리티 함수를 제공합니다.</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">매크로:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">KOR_START, KOR_END: 한글 유니코드 범위 시작과 끝을 나타냅니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">BATCHIM_NONE, BATCHIM_RIEUL: 받침이 없음, 'ㄹ' 받침을 나타냅니다.</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">JosaType 열거형:</strong> 조사 유형을 정의합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">JosaRule 구조체:</strong> 조사 규칙을 저장합니다.</p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">type: 조사 유형(JosaType 열거형 값)</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">josa_with_batchim: 받침이 있을 때 사용할 조사 문자열</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">josa_without_batchim: 받침이 없을 때 사용할 조사 문자열</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">함수:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">bool is_korean(unsigned int code): 주어진 유니코드 코드가 한글인지 확인합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">void check_batchim(unsigned int code, bool* has_batchim, bool* is_batchim_rieul): 주어진 유니코드 코드의 받침 여부와 'ㄹ' 받침 여부를 확인합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">unsigned int next_char(const char* str, int len, int* index): UTF-8 문자열에서 다음 문자의 코드 포인트를 반환합니다.</p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">str: UTF-8 문자열</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">len: 문자열의 길이 (바이트 단위)</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">index: 현재 문자 위치 (바이트 단위). 함수 호출 후 다음 문자 위치로 변경됩니다.</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">const char* select_josa(const char* word, JosaType josa_type): 주어진 단어와 조사 유형에 따라 적절한 조사를 선택합니다.</p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">word: 문자열 형태의 단어</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">josa_type: 조사 유형 (예: EUN_NEUN, I_GA, EUL_REUL, EURO_RO, GWA_WA, IRAN_RAN)</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">조사 규칙을 JosaRule 배열에 저장하고 순차적으로 탐색합니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">next_char, check_batchim 함수를 사용하여 단어의 받침 여부를 확인하고, josa_type에 따라 적절한 조사를 반환합니다.</p> </li> </ul> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">사용 예시:</strong></p> <pre _ngcontent-ng-c257604760=""> <code _ngcontent-ng-c257604760="">int main() { // 조사 선택 예시 printf("물%sn", select_josa("물", EUL_REUL)); // 물을 printf("밥%sn", select_josa("밥", EUL_REUL)); // 밥을 printf("서울%sn", select_josa("서울", EURO_RO)); // 서울로 // ... return 0; }</code> </pre> </li> </ol> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">공통 사항:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">숫자 처리:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">숫자 1, 3, 6, 0으로 끝나는 단어는 받침이 있는 것으로 처리됩니다.</p> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">숫자 7, 8로 끝나는 단어는 'ㄹ' 받침이 있는 것으로 처리됩니다.</p> </li> </ul> </li> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233=""><strong _ngcontent-ng-c2971488233="">UTF-8 지원:</strong></p> <ul _ngcontent-ng-c2971488233=""> <li _ngcontent-ng-c2971488233=""> <p _ngcontent-ng-c2971488233="">파이썬 코드는 기본적으로 유니코드를 지원하며, C 코드는 UTF-8 문자열을 사용하여 유니코드를 처리합니다.</p> </li> </ul> </li> </ul> <p _ngcontent-ng-c2971488233=""><br /> 파이썬)</p> <p>import logging</p> <p># 로깅 설정<br /> logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')</p> <p>class JosaRule:<br /> """조사 규칙을 나타내는 클래스."""<br /> def __init__(self, josa_type, has_batchim, josa_with_batchim, josa_without_batchim):<br /> self.josa_type = josa_type<br /> self.has_batchim = has_batchim # 이 속성은 더 이상 사용되지 않음<br /> self.josa_with_batchim = josa_with_batchim<br /> self.josa_without_batchim = josa_without_batchim<br /> self.batchim_cache = {} # 받침 유무 캐시</p> <p> def apply(self, word):<br /> """단어에 대한 조사를 선택하고 반환한다."""<br /> last_char = word[-1]<br /> has_batchim, is_batchim_l = self._has_batchim(last_char)</p> <p> # has_batchim, is_batchim_l 값을 직접 사용하도록 수정<br /> if has_batchim:<br /> return self.josa_with_batchim<br /> else:<br /> return self.josa_without_batchim</p> <p> def _has_batchim(self, char):<br /> """주어진 문자가 받침을 가지는지 확인하고, 받침이 'ㄹ'인지 여부도 반환한다.<br /> 숫자의 경우 1,3,6,7,8,0 은 받침이 있는 것으로, 7,8은 'ㄹ' 받침이 있는 것으로 처리한다.<br /> """<br /> if char in self.batchim_cache:<br /> return self.batchim_cache[char]</p> <p> if '가' <= char <= '힣':<br /> batchim_code = (ord(char) - ord('가')) % 28<br /> if batchim_code == 0:<br /> result = (False, False) # 받침 없음<br /> elif batchim_code == 8:<br /> result = (True, True) # 받침이 'ㄹ'<br /> else:<br /> result = (True, False) # 받침이 있고 'ㄹ' 아님<br /> elif '0' <= char <= '9':<br /> if char in ['1', '3', '6', '0']:<br /> result = (True, False) # 1, 3, 6, 0 받침 있음<br /> elif char in ['7', '8']:<br /> result = (True, True) # 7, 8 받침 있고 'ㄹ'<br /> else:<br /> result = (False, False) # 그 외 숫자 받침 없음<br /> else:<br /> result = (False, False)<br /> <br /> self.batchim_cache[char] = result<br /> return result</p> <p>class JosaSelector:<br /> """조사 선택기를 관리하는 클래스."""<br /> def __init__(self):<br /> """초기 조사 규칙을 설정한다."""<br /> self.rules = {<br /> "은/는": JosaRule("은/는", "있음", "은", "는"),<br /> "이/가": JosaRule("이/가", "있음", "이", "가"),<br /> "을/를": JosaRule("을/를", "있음", "을", "를"),<br /> "으로/로": JosaRule("으로/로", "로", "으로", "로"),<br /> "과/와": JosaRule("과/와", None, "과", "와"),<br /> "이란/란": JosaRule("이란/란", "있음", "이란", "란")<br /> }</p> <p> def select_josa(self, word, josa_type):<br /> """단어와 조사 유형에 따라 적절한 조사를 선택한다."""<br /> logging.debug(f"select_josa called with word: '{word}', josa_type: '{josa_type}'")<br /> if not word:<br /> raise ValueError("단어를 입력해주세요.")<br /> if not josa_type:<br /> raise ValueError("조사 유형을 입력해주세요.")</p> <p> # 딕셔너리를 사용하여 규칙을 빠르게 찾음<br /> if josa_type in self.rules:<br /> rule = self.rules[josa_type]<br /> if josa_type == "으로/로": # "으로/로" 조사 처리<br /> last_char = word[-1]<br /> has_batchim, is_batchim_l = rule._has_batchim(last_char)<br /> if not has_batchim:<br /> josa = rule.josa_without_batchim<br /> elif is_batchim_l:<br /> josa = rule.josa_without_batchim<br /> else:<br /> josa = rule.josa_with_batchim<br /> else: # 나머지 조사 처리<br /> josa = rule.apply(word)<br /> if josa:<br /> logging.debug(f"Josa selected: '{josa}' for word: '{word}', josa_type: '{josa_type}'")<br /> return josa<br /> else:<br /> logging.error(f"No matching rule found for word: '{word}', josa_type: '{josa_type}'")<br /> raise ValueError(f"'{josa_type}' 조사 유형을 찾을 수 없습니다.")</p> <p>if __name__ == "__main__":<br /> josa_selector = JosaSelector()</p> <p> # 조사 선택 예시<br /> try:<br /> print(josa_selector.select_josa("물", "을/를")) # 물을<br /> print(josa_selector.select_josa("차", "을/를")) # 차를<br /> print(josa_selector.select_josa("서울", "으로/로")) # 서울로<br /> print(josa_selector.select_josa("부산", "으로/로")) # 부산으로<br /> print(josa_selector.select_josa("달", "으로/로")) # 달로<br /> <br /> print(josa_selector.select_josa("동물", "과/와")) # 동물과<br /> print(josa_selector.select_josa("강아지", "과/와")) # 강아지와</p> <p> print(josa_selector.select_josa("터키", "이란/란")) # 터키란<br /> print(josa_selector.select_josa("미국", "이란/란")) # 미국이란</p> <p> print(josa_selector.select_josa("사과3", "은/는")) # 사과3은<br /> print(josa_selector.select_josa("사과12", "은/는")) # 사과12는<br /> print(josa_selector.select_josa("오렌지6", "은/는")) # 오렌지6은<br /> print(josa_selector.select_josa("오렌지10", "은/는")) # 오렌지10은<br /> print(josa_selector.select_josa("오렌지", "은/는")) # 오렌지는<br /> <br /> print(josa_selector.select_josa("사과7", "으로/로")) # 사과7로<br /> print(josa_selector.select_josa("사과8", "으로/로")) # 사과8로<br /> <br /> print(josa_selector.select_josa("배1", "이/가")) # 배1이<br /> print(josa_selector.select_josa("배2", "이/가")) # 배2가<br /> print(josa_selector.select_josa("배", "이/가")) # 배가<br /> except ValueError as e:<br /> print(f"오류: {e}")</p> <p _ngcontent-ng-c2971488233=""><br /> <br /> c언어)</p> <p>#include <stdio.h><br /> #include <string.h><br /> #include <stdbool.h><br /> #include <stdlib.h></p> <p>// 한글 유니코드 범위 시작과 끝<br /> #define KOR_START 0xAC00<br /> #define KOR_END 0xD7A3</p> <p>// 받침 코드<br /> #define BATCHIM_NONE 0<br /> #define BATCHIM_RIEUL 8</p> <p>// 조사 유형<br /> typedef enum {<br /> EUN_NEUN,<br /> I_GA,<br /> EUL_REUL,<br /> EURO_RO,<br /> GWA_WA,<br /> IRAN_RAN<br /> } JosaType;</p> <p>// 조사 규칙 구조체<br /> typedef struct {<br /> JosaType type;<br /> const char* josa_with_batchim;<br /> const char* josa_without_batchim;<br /> } JosaRule;</p> <p>// 주어진 문자가 한글인지 확인<br /> bool is_korean(unsigned int code) {<br /> return code >= KOR_START && code <= KOR_END;<br /> }</p> <p>// 주어진 문자의 받침 여부와 'ㄹ' 받침 여부 확인<br /> // 숫자에 대한 규칙도 처리<br /> void check_batchim(unsigned int code, bool* has_batchim, bool* is_batchim_rieul) {<br /> if (is_korean(code)) {<br /> int batchim_code = (code - KOR_START) % 28;<br /> *has_batchim = batchim_code != BATCHIM_NONE;<br /> *is_batchim_rieul = batchim_code == BATCHIM_RIEUL;<br /> } else if (code >= '0' && code <= '9') {<br /> *has_batchim = (code == '1' || code == '3' || code == '6' || code == '0');<br /> *is_batchim_rieul = (code == '7' || code == '8');<br /> } else {<br /> *has_batchim = false;<br /> *is_batchim_rieul = false;<br /> }<br /> }</p> <p>// UTF-8 문자열에서 다음 문자의 코드 포인트 반환<br /> // len: 문자열의 길이 (바이트 단위)<br /> // index: 현재 문자 위치 (바이트 단위)<br /> // return: 다음 문자의 코드 포인트, index 변경<br /> unsigned int next_char(const char* str, int len, int* index) {<br /> unsigned int code = 0;<br /> int i = *index;<br /> if ((str[i] & 0x80) == 0) {<br /> code = str[i];<br /> (*index)++;<br /> } else if ((str[i] & 0xE0) == 0xC0) {<br /> code = ((str[i] & 0x1F) << 6) | (str[i + 1] & 0x3F);<br /> (*index) += 2;<br /> } else if ((str[i] & 0xF0) == 0xE0) {<br /> code = ((str[i] & 0x0F) << 12) | ((str[i + 1] & 0x3F) << 6) | (str[i + 2] & 0x3F);<br /> (*index) += 3;<br /> } else {<br /> // 에러 처리 (여기서는 간단히 0 반환)<br /> (*index) = len; // 문자열 끝으로 이동<br /> return 0;<br /> }<br /> return code;<br /> }<br /> // 단어와 조사 유형에 따라 적절한 조사를 선택하여 반환<br /> const char* select_josa(const char* word, JosaType josa_type) {<br /> // 조사 규칙<br /> JosaRule rules[] = {<br /> {EUN_NEUN, "은", "는"},<br /> {I_GA, "이", "가"},<br /> {EUL_REUL, "을", "를"},<br /> {EURO_RO, "으로", "로"},<br /> {GWA_WA, "과", "와"},<br /> {IRAN_RAN, "이란", "란"}<br /> };<br /> int num_rules = sizeof(rules) / sizeof(rules[0]);</p> <p> // 단어의 마지막 문자 확인<br /> int len = strlen(word);<br /> int index = 0;<br /> unsigned int last_char = 0;<br /> while (index < len) {<br /> last_char = next_char(word, len, &index);<br /> }</p> <p> // 받침 확인<br /> bool has_batchim, is_batchim_rieul;<br /> check_batchim(last_char, &has_batchim, &is_batchim_rieul);</p> <p> // 조사 선택<br /> for (int i = 0; i < num_rules; i++) {<br /> if (rules[i].type == josa_type) {<br /> if (josa_type == EURO_RO) {<br /> if (!has_batchim) {<br /> return rules[i].josa_without_batchim;<br /> } else if (is_batchim_rieul) {<br /> return rules[i].josa_without_batchim;<br /> } else {<br /> return rules[i].josa_with_batchim;<br /> }<br /> } else {<br /> return has_batchim ? rules[i].josa_with_batchim : rules[i].josa_without_batchim;<br /> }<br /> }<br /> }</p> <p> // 일치하는 조사 유형이 없는 경우<br /> return NULL;<br /> }</p> <p>int main() {<br /> // 조사 선택 예시<br /> printf("물%sn", select_josa("물", EUL_REUL)); // 물을<br /> printf("밥%sn", select_josa("차", EUL_REUL)); // 차를<br /> printf("서울%sn", select_josa("서울", EURO_RO)); // 서울로<br /> printf("부산%sn", select_josa("부산", EURO_RO)); // 부산으로<br /> printf("달%sn", select_josa("달", EURO_RO)); // 달로<br /> printf("친구%sn", select_josa("동물", GWA_WA)); // 동물과<br /> printf("강아지%sn", select_josa("강아지", GWA_WA)); // 강아지와<br /> printf("한국%sn", select_josa("한국", IRAN_RAN)); // 한국이란<br /> printf("미국%sn", select_josa("미국", IRAN_RAN)); // 미국이란<br /> printf("사과3%sn", select_josa("사과3", EUN_NEUN)); // 사과3은<br /> printf("사과12%sn", select_josa("사과12", EUN_NEUN)); // 사과12는<br /> printf("오렌지6%sn", select_josa("오렌지6", EUN_NEUN)); // 오렌지6은<br /> printf("오렌지10%sn", select_josa("오렌지10", EUN_NEUN)); // 오렌지10은<br /> printf("오렌지%sn", select_josa("오렌지", EUN_NEUN)); // 오렌지는<br /> printf("사과7%sn", select_josa("사과7", EURO_RO)); // 사과7로<br /> printf("사과8%sn", select_josa("사과8", EURO_RO)); // 사과8로<br /> printf("배1%sn", select_josa("배1", I_GA)); // 배1이<br /> printf("배2%sn", select_josa("배2", I_GA)); // 배2가<br /> printf("배%sn", select_josa("배", I_GA)); // 배가<br /> return 0;<br /> }</p>
0
0
새글
답변
수정
삭제
최신목록
전체목록
이전 게시글이 없습니다.
EUC-KR 및 UTF8 한글 처리
0
Comments
-표시할 내용이 없습니다.-
코멘트를 삭제할 비밀번호를 입력하세요.
비밀번호:
댓글에 답하기
입력
닫기
정회원 이상만 코멘트 쓰기가 가능합니다.
총 게시물 108개 / 검색된 게시물: 108개
누구든지 머드 강의를 올리수 있는 곳입니다...^^
[기타]
UTF-8 한글 조사처리 (파이썬, c)
0
59
0
0
암로
2025-01-01
[circle]
EUC-KR 및 UTF8 한글 처리
0
299
0
0
울보천사
2024-01-08
[기타]
유니코드(utf-8) 한글 조사 처리
0
1207
0
0
암로
2020-08-01
[hanlp]
지도소스 수정
1
1384
1
0
오코
2018-06-07
[기타]
머드 계보
1
10442
0
0
암로
2012-04-28
[mordor]
의형제
0
5329
0
0
LostMemory
2007-10-19
[mordor]
폭탄소스
0
5578
0
0
LostMemory
2007-10-19
[mordor]
패거리 등급 변경
0
6302
0
0
LostMemory
2007-10-19
[mordor]
날짜관리
0
4543
0
0
LostMemory
2007-10-19
[mordor]
마법 추가하기
0
5328
0
0
LostMemory
2007-10-19
[hanlp]
레벨 최대화 32767
0
5455
0
0
LostMemory
2007-10-19
[mordor]
분신이란 기술
0
4802
0
0
LostMemory
2007-10-19
[mordor]
연타
0
4457
0
0
LostMemory
2007-10-19
[mordor]
이자소스
0
5302
0
0
LostMemory
2007-10-19
[mordor]
편지를 아이템화
0
3662
0
0
LostMemory
2007-10-19
[mordor]
직업추가
0
3235
0
0
LostMemory
2007-10-19
[mordor]
패거리 상점 만들기
0
3246
0
0
LostMemory
2007-10-19
[기타]
단땅..프로그램은 멀로 하는거죰.. 첨이라..^^
1
3754
0
0
사마천
2006-06-22
[circle]
오래된거지만.. 써클머드 화일들에 대한 간략한 설명..
2
4260
0
0
머큐리
2006-06-10
[기타]
Dead Souls 2 is now available
2
3000
0
0
Cratylus M.
2006-03-14
1
2
3
4
5
6
다음
검색
글쓰기
최신목록
전체목록
시작일
종료일
분류별 검색
전체보기
기타
circle
hanlp
mordor
소스분석
흑염
천무혼
검색어
이름
제목
내용
검색
닫기
로그인
회원가입
계정찾기
개인정보처리방침
이용약관
PC화면
Copyright (c) 텍스트머드클럽. All rights reserved.
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
닉네임으로 입력
내용
쪽지가 도착하였습니다.
쪽지함
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--