[iOS] 한글 종성에 따른 ‘을/를’ 구분

less than 1 minute read

이슈

  • ‘을/를’ 등의 조사를 구분해서 노출하는 스펙 필요

해결

  • 한글의 유니코드 값을 이용하여, 마지막 글자에 종성(받침)이 있는지 확인이 가능함
  • 마지막 글자의 종성 유무에 따라 ‘을/를’ 구분 하여 적용 가능
/*
 * 한글 음절 문자 집합 (가-힣) : CharacterSet(charactersIn: "\u{ac00}"..."\u{d7a3}")
 * 초성: ((한글 유니코드 값 - 0xAC00 / 28) / 21)
 * 중성: ((한글 유니코드 값 - 0xAC00 / 28) % 21)
 * 종성: (한글 유니코드 값 - 0xAC00 % 28)
 */
public extension String {
    func koreanPostPositionText() -> String {
        guard let lastText = self.last else {
            return self
        }

        guard let unicode = UnicodeScalar(String(lastText)) else {
            return self
        }

        let postStr = hasKoreanSyllablesJongSung(unicode) ? "을" : "를"

        return self + postStr
    }
}

private extension String {
    private func isKoreanSyllables(_ unicode: UnicodeScalar) -> Bool {
        return CharacterSet.koreanSyllables.contains(unicode)
    }

    private func hasKoreanSyllablesJongSung (_ unicode: UnicodeScalar) -> Bool {
        return isKoreanSyllables(unicode) && (unicode.value - 0xAC00) % 28 > 0
    }
}

private extension CharacterSet {
    static var koreanSyllables : CharacterSet {
        get {
            struct Static {
                static let characterSet = CharacterSet(charactersIn: "\u{ac00}"..."\u{d7a3}")
            }
            return Static.characterSet
        }
    }
}

Reference

Leave a comment