한국어 은/는 이/가 와/가 javascript로 처리하기

김현재·2022년 7월 10일
3
post-thumbnail


위에처럼 종종 개발을 하다보면 종성에 따른 조사 처리를 해줘야하는 경우가 발생한다.
처음에 마주하면 참으로 난감?하고 뭣보다 검색을 어떻게 해야할지 감조차 오지 않아 매우 막막하다...

역시 정보의 바다 구글 답게 찾아보니 다 나왔다..ㅎ

문제 상황

은/는, 이/가 와 비슷하게, 와/과를 앞 명사에 따라 적절하게 배치해야 했다.
ex) 네이버페이"와" vs 쿠팡"과"

해결 방법

해결을 위해선 한국어 문법 규칙을 먼저 찾아내야한다.
와/가 같은 경우는 밭침이 있는 글자 뒤에는 "과"가, 밭침이 없는 글자 뒤에는 "와"가 온다.
즉 종성의 유무로 구분하면 되어 간단한 편.

종성 유무 확인하기

종성의 유무는 글자를 유니코드로 반환하여 찾아낸다.
자바스크립트 charCodeAt 메소드를 사용하면 유니코드로 문자가 변환 가능하며,
마지막 글자의 종성(밭침)을 비교하면 되기에, 마지막 글자에 대한 유니코드 반환하도록 한다.

[안드로이드/JAVA]한글 받침에따라서 '을/를' 구분하기 블로그 포스트를 보고 많은 도움을 얻었는데,
아래와 같은 규칙으로 유니코드를 분해할 수 있다

유니코드 분해하기
초성 인덱스 = ((한글 유니코드값 - 0xAC00) / 28) / 21
중성 인덱스 = ((한글 유니코드값 - 0xAC00) / 28) % 21
종성 인덱스 = (한글 유니코드값 - 0xAC00) % 28

밭침의 유무를 알아내기 위해선, 종성 인덱스가 있냐 없냐를 확인하면 되기에, 아래와 같이 코드를 구성해보았다.

const checkKorean = (name: string) => {
  const lastChar = name.charCodeAt(name.length - 1)
  const isThereLastChar = (lastChar - 0xac00) % 28
  if (isThereLastChar) {
    return '과'
  }
  return '와'
}

export default checkKorean

이러면, 아까 위에서 본 그림과 같이 "와", "가" 가 구분된다.
을/를, 이/가도 이러한 문법 규칙을 찾아낸 뒤, 유니코드 인덱스를 활용하면, 초성, 중성, 종성 각각에 대한 컨트롤이 가능해진다^__^

생각보다 간단하다.

참고자료

profile
쉽게만 살아가면 재미없어 빙고!

3개의 댓글

comment-user-thumbnail
2022년 7월 29일

npm 라이브러리 중에 josa라는게 있더라고요 어떤 식으로 구현했는지 그거 안에 코드를 좀 봐야겠네요

1개의 답글
comment-user-thumbnail
2023년 12월 8일

이런 계열 라이브러리는 단언컨데 요게 최고입니다. (셀프 홍보입니다. 죄송합니다. 😅)
https://www.npmjs.com/package/@kokr/text

답글 달기